1 Introduction: Mapping of broad research field around EIST in v2

Here are preliminary results of the bibliometric mapping of EIST. Its purpose is:

The method for the research-field-mapping can be reviewed here:

Rakas, M., & Hain, D. S. (2019). The state of innovation system research: What happens beneath the surface?. Research Policy, 48(9), 103787.

Note: The analysis in this document depicts the larger research field around the department, thereby all analysis results are based on the publications of the department plus related

2 General Overview over the research field

Note: This section provides basic descriptives of th identified research fielld, including number of articles over time, countries, institutions, and authors. See Technical descriptionfor additional explanations.

2.1 Main Indicators: Publications, Authors, Countries

3 Topic modelling

Note: Here, we report the results of a LDA topic-modelling (basically, clustering on words) on all title+abstract texts. Identified topics can be interpreted as broad themes in the research field. See Technical descriptionfor additional explanations.

3.1 Topics by topwords

Note: While this static vies is helpful, I recommend using the interactive LDAVis version to be found under https://daniel-hain.github.io/biblio_lux_2022/output/topic_modelling/LDAviz_eist_v2/index.html#topic=1&lambda=0.60&term=. For functionality and usage, see ´Technical ´.

4 Knowledge Bases: Co-Citation network analysis

Note: This analysis refers the co-citation analysis, where the cited references and not the original publications are the unit of analysis. Identified knowledge bases can be interpreted as the knowledge foundation the field draws from. See Technical descriptionfor additional explanations.

name dgr_int dgr
Knowledge Base 1: KB 1: unlabeled (n = 341, density =10.35)
GEELS F.W. TECHNOLOGICAL TRANSITIONS AS EVOLUTIONARY RECONFIGURATION PROCESSES: A MULTI-LEVEL PERSPECTIVE AND A CASE-STUDY (2002) 1318 2964
GEELS F.W. SCHOT J. TYPOLOGY OF SOCIOTECHNICAL TRANSITION PATHWAYS (2007) 1021 2281
GEELS F.W. THE MULTI-LEVEL PERSPECTIVE ON SUSTAINABILITY TRANSITIONS: RESPONSES TO SEVEN CRITICISMS (2011) 720 1570
SMITH A. STIRLING A. BERKHOUT F. THE GOVERNANCE OF SUSTAINABLE SOCIO-TECHNICAL TRANSITIONS (2005) 521 1038
GEELS F.W. FROM SECTORAL SYSTEMS OF INNOVATION TO SOCIO-TECHNICAL SYSTEMS: INSIGHTS ABOUT DYNAMICS AND CHANGE FROM SOCIOLOGY AND INSTITUTIONAL THEO... 416 972
FARLA J. MARKARD J. RAVEN R. COENEN L. SUSTAINABILITY TRANSITIONS IN THE MAKING: A CLOSER LOOK AT ACTORS STRATEGIES AND RESOURCES (2012) 367 756
RIP A. KEMP R. TECHNOLOGICAL CHANGE (1998) 355 675
UNRUH G.C. UNDERSTANDING CARBON LOCK-IN (2000) 287 594
GEELS F.W. ONTOLOGIES SOCIO-TECHNICAL TRANSITIONS (TO SUSTAINABILITY) 233 546
ROTMANS J. KEMP R. VAN ASSELT M. MORE EVOLUTION THAN REVOLUTION: TRANSITION MANAGEMENT IN PUBLIC POLICY (2001) 220 404
Knowledge Base 2: KB 2: unlabeled (n = 192, density =12.84)
MARKARD J. RAVEN R. TRUFFER B. SUSTAINABILITY TRANSITIONS: AN EMERGING FIELD OF RESEARCH AND ITS PROSPECTS (2012) 554 2636
COENEN L. BENNEWORTH P. TRUFFER B. TOWARD A SPATIAL PERSPECTIVE ON SUSTAINABILITY TRANSITIONS (2012) 425 1202
HANSEN T. COENEN L. THE GEOGRAPHY OF SUSTAINABILITY TRANSITIONS: REVIEW SYNTHESIS AND REFLECTIONS ON AN EMERGENT RESEARCH FIELD (2015) 326 755
RAVEN R. SCHOT J. BERKHOUT F. SPACE AND SCALE IN SOCIO-TECHNICAL TRANSITIONS (2012) 252 491
HODSON M. MARVIN S. CAN CITIES SHAPE SOCIO-TECHNICAL TRANSITIONS AND HOW WOULD WE KNOW IF THEY WERE? (2010) 216 445
KÖHLER J. GEELS F.W. KERN F. MARKARD J. ONSONGO E. WIECZOREK A. ALKEMADE F. WELLS P. AN AGENDA FOR SUSTAINABILITY TRANSITIONS RESEARCH: STATE OF TH... 185 560
COENEN L. TRUFFER B. PLACES AND SPACES OF SUSTAINABILITY TRANSITIONS: GEOGRAPHICAL CONTRIBUTIONS TO AN EMERGING RESEARCH AND POLICY FIELD (2012) 127 233
TRUFFER B. MURPHY J.T. RAVEN R. THE GEOGRAPHY OF SUSTAINABILITY TRANSITIONS: CONTOURS OF AN EMERGING THEME (2015) 119 249
SENGERS F. RAVEN R. TOWARD A SPATIAL PERSPECTIVE ON NICHE DEVELOPMENT: THE CASE OF BUS RAPID TRANSIT (2015) 102 261
FUENFSCHILLING L. BINZ C. GLOBAL SOCIO-TECHNICAL REGIMES (2018) 91 274
Knowledge Base 3: KB 3: unlabeled (n = 161, density =30.68)
BERGEK A. JACOBSSON S. CARLSSON B. LINDMARK S. RICKNE A. ANALYZING THE FUNCTIONAL DYNAMICS OF TECHNOLOGICAL INNOVATION SYSTEMS: A SCHEME OF ANALYSI... 742 1325
HEKKERT M.P. SUURS R.A.A. NEGRO S.O. KUHLMANN S. SMITS R.E.H.M. FUNCTIONS OF INNOVATION SYSTEMS: A NEW APPROACH FOR ANALYSING TECHNOLOGICAL CHANGE ... 402 773
CARLSSON B. STANKIEWICZ R. ON THE NATURE FUNCTION AND COMPOSITION OF TECHNOLOGICAL SYSTEMS (1991) 398 517
MARKARD J. TRUFFER B. TECHNOLOGICAL INNOVATION SYSTEMS AND THE MULTI-LEVEL PERSPECTIVE: TOWARDS AN INTEGRATED FRAMEWORK (2008) 395 842
BERGEK A. HEKKERT M. JACOBSSON S. MARKARD J. SANDÉN B. TRUFFER B. TECHNOLOGICAL INNOVATION SYSTEMS IN CONTEXTS: CONCEPTUALIZING CONTEXTUAL STRUCTUR... 325 450
JACOBSSON S. BERGEK A. INNOVATION SYSTEM ANALYSES AND SUSTAINABILITY TRANSITIONS: CONTRIBUTIONS AND SUGGESTIONS FOR RESEARCH (2011) 227 348
DEWALD U. TRUFFER B. THE LOCAL SOURCES OF MARKET FORMATION: EXPLAINING REGIONAL GROWTH DIFFERENTIALS IN GERMAN PHOTOVOLTAIC MARKETS (2012) 203 343
JACOBSSON S. BERGEK A. TRANSFORMING THE ENERGY SECTOR: THE EVOLUTION OF TECHNOLOGICAL SYSTEMS IN RENEWABLE ENERGY TECHNOLOGY (2004) 197 280
MUSIOLIK J. MARKARD J. CREATING AND SHAPING INNOVATION SYSTEMS: FORMAL NETWORKS IN THE INNOVATION SYSTEM FOR STATIONARY FUEL CELLS IN GERMANY (2011) 192 272
WIECZOREK A.J. HEKKERT M.P. SYSTEMIC INSTRUMENTS FOR SYSTEMIC INNOVATION PROBLEMS: A FRAMEWORK FOR POLICY MAKERS AND INNOVATION SCHOLARS (2012) 185 300
Knowledge Base 4: KB 4: unlabeled (n = 161, density =25.26)
GEELS F.W. REGIME RESISTANCE AGAINST LOW-CARBON TRANSITIONS: INTRODUCING POLITICS AND POWER INTO THE MULTI-LEVEL PERSPECTIVE (2014) 427 1086
MEADOWCROFT J. ENGAGING WITH THE POLITICS OF SUSTAINABILITY TRANSITIONS (2011) 340 733
KIVIMAA P. KERN F. CREATIVE DESTRUCTION OR MERE NICHE SUPPORT? INNOVATION POLICY MIXES FOR SUSTAINABILITY TRANSITIONS (2016) 320 672
TURNHEIM B. GEELS F.W. THE DESTABILISATION OF EXISTING REGIMES: CONFRONTING A MULTI-DIMENSIONAL FRAMEWORK WITH A CASE STUDY OF THE BRITISH COAL IND... 212 314
BERGGREN C. MAGNUSSON T. SUSHANDOYO D. TRANSITION PATHWAYS REVISITED: ESTABLISHED FIRMS AS MULTI-LEVEL ACTORS IN THE HEAVY VEHICLE INDUSTRY (2015) 184 373
HESS D.J. SUSTAINABILITY TRANSITIONS: A POLITICAL COALITION PERSPECTIVE (2014) 183 391
MEADOWCROFT J. WHAT ABOUT THE POLITICS? SUSTAINABLE DEVELOPMENT TRANSITION MANAGEMENT AND LONG TERM ENERGY TRANSITIONS (2009) 172 423
KUNGL G. GEELS F.W. SEQUENCE AND ALIGNMENT OF EXTERNAL PRESSURES IN INDUSTRY DESTABILISATION: UNDERSTANDING THE DOWNFALL OF INCUMBENT UTILITIES IN ... 169 222
GEELS F.W. RECONCEPTUALISING THE CO-EVOLUTION OF FIRMS-IN-INDUSTRIES AND THEIR ENVIRONMENTS: DEVELOPING AN INTER-DISCIPLINARY TRIPLE EMBEDDEDNESS F... 157 300
AVELINO F. ROTMANS J. POWER IN TRANSITION: AN INTERDISCIPLINARY FRAMEWORK TO STUDY POWER IN RELATION TO STRUCTURAL CHANGE (2009) 145 502
Knowledge Base 5: KB 5: unlabeled (n = 134, density =17.41)
SMITH A. RAVEN R. WHAT IS PROTECTIVE SPACE? RECONSIDERING NICHES IN TRANSITIONS TO SUSTAINABILITY (2012) 432 2040
KEMP R. SCHOT J. HOOGMA R. REGIME SHIFTS TO SUSTAINABILITY THROUGH PROCESSES OF NICHE FORMATION: THE APPROACH OF STRATEGIC NICHE MANAGEMENT (1998) 409 1930
SCHOT J. GEELS F.W. STRATEGIC NICHE MANAGEMENT AND SUSTAINABLE INNOVATION JOURNEYS: THEORY FINDINGS RESEARCH AGENDA AND POLICY (2008) 252 937
SEYFANG G. SMITH A. GRASSROOTS INNOVATIONS FOR SUSTAINABLE DEVELOPMENT: TOWARDS A NEW RESEARCH AND POLICY AGENDA (2007) 218 400
SMITH A. TRANSLATING SUSTAINABILITIES BETWEEN GREEN NICHES AND SOCIO-TECHNICAL REGIMES (2007) 158 528
ORNETZEDER M. ROHRACHER H. OF SOLAR COLLECTORS WIND POWER AND CAR SHARING: COMPARING AND UNDERSTANDING SUCCESSFUL CASES OF GRASSROOTS INNOVATIONS (... 116 160
SEYFANG G. HAXELTINE A. GROWING GRASSROOTS INNOVATIONS: EXPLORING THE ROLE OF COMMUNITY-BASED INITIATIVES IN GOVERNING SUSTAINABLE ENERGY TRANSITIO... 102 270
SEYFANG G. HIELSCHER S. HARGREAVES T. MARTISKAINEN M. SMITH A. A GRASSROOTS SUSTAINABLE ENERGY NICHE? REFLECTIONS ON COMMUNITY ENERGY IN THE UK (2014) 71 147
HARGREAVES T. HIELSCHER S. SEYFANG G. SMITH A. GRASSROOTS INNOVATIONS IN COMMUNITY ENERGY: THE ROLE OF INTERMEDIARIES IN NICHE DEVELOPMENT (2013) 66 83
SEYFANG G. LONGHURST N. DESPERATELY SEEKING NICHES: GRASSROOTS INNOVATIONS AND NICHE DEVELOPMENT IN THE COMMUNITY CURRENCY FIELD (2013) 48 71

5 Research Areas: Bibliographic coupling analysis

Note: This analysis refers the bibliographic coupling analysis, where original publications are the unit of analysis. Identified research areas can be interpreted as the field’s current research frontier. See Technical descriptionfor additional explanations.

AU PY TI dgr_int TC TC_year
Research Area 1: RA 1: unlabeled (n = 168, density =0.67)
GEELS FW 2011 THE MULTI-LEVEL PERSPECTIVE ON SUSTAINABILITY TRANSITIONS: RESPONSES TO SEVEN CRITICISMS 3.62 1409 128.09
VAN DEN BERGH JCJM;TRU... 2011 ENVIRONMENTAL INNOVATION AND SOCIETAL TRANSITIONS: INTRODUCTION AND OVERVIEW 1.27 282 25.64
RAVEN R;KERN F;VERHEES... 2016 NICHE CONSTRUCTION AND EMPOWERMENT THROUGH SOCIO-POLITICAL WORK. A META-ANALYSIS OF SIX LOW-CARBON TECHNOLOGY CASES 1.87 168 28.00
RAVENA R;SCHOTA J;BERK... 2012 SPACE AND SCALE IN SOCIO-TECHNICAL TRANSITIONS 0.93 281 28.10
KLITKOU A;BOLWIG S;HAN... 2015 THE ROLE OF LOCK-IN MECHANISMS IN TRANSITION PROCESSES: THE CASE OF ENERGY FOR ROAD TRANSPORT 1.31 155 22.14
MEADOWCROFT J 2011 ENGAGING WITH THE POLITICS OF SUSTAINABILITY TRANSITIONS 0.49 394 35.82
NORMANN HE 2015 THE ROLE OF POLITICS IN SUSTAINABLE TRANSITIONS: THE RISE AND DECLINE OF OFFSHORE WIND IN NORWAY 2.31 79 11.29
STIRLING A 2011 PLURALISING PROGRESS: FROM INTEGRATIVE TRANSITIONS TO TRANSFORMATIVE DIVERSITY 1.26 137 12.45
SARASINI S;LINDER M 2018 INTEGRATING A BUSINESS MODEL PERSPECTIVE INTO TRANSITION THEORY: THE EXAMPLE OF NEW MOBILITY SERVICES 2.11 80 20.00
ELZEN B;VAN MIERLO B;L... 2012 ANCHORING OF INNOVATIONS: ASSESSING DUTCH EFFORTS TO HARVEST ENERGY FROM GLASSHOUSES 1.31 125 12.50
Research Area 2: RA 2: unlabeled (n = 99, density =0.7)
KÖHLER J;GEELS FW;KERN... 2019 AN AGENDA FOR SUSTAINABILITY TRANSITIONS RESEARCH: STATE OF THE ART AND FUTURE DIRECTIONS 0.53 868 289.33
MARKARD J;SUTER M;INGO... 2016 SOCIO-TECHNICAL TRANSITIONS AND POLICY CHANGE - ADVOCACY COALITIONS IN SWISS ENERGY POLICY 1.38 172 28.67
JOHNSTONE P;NEWELL P 2018 SUSTAINABILITY TRANSITIONS AND THE STATE 1.27 120 30.00
KERN F;ROGGE KS 2018 HARNESSING THEORIES OF THE POLICY PROCESS FOR ANALYSING THE POLITICS OF SUSTAINABILITY TRANSITIONS: A CRITICAL SURVEY 1.27 90 22.50
TURNHEIM B;SOVACOOL BK 2020 FOREVER STUCK IN OLD WAYS? PLURALISING INCUMBENCIES IN SUSTAINABILITY TRANSITIONS 1.79 61 30.50
WILLIAMS S;DOYON A 2019 JUSTICE IN ENERGY TRANSITIONS 1.06 95 31.67
ROSENBLOOM D 2018 FRAMING LOW-CARBON PATHWAYS: A DISCURSIVE ANALYSIS OF CONTENDING STORYLINES SURROUNDING THE PHASE-OUT OF COAL-FIRED POWER ... 1.31 70 17.50
RAVEN R;KERN F;SMITH A... 2016 THE POLITICS OF INNOVATION SPACES FOR LOW-CARBON ENERGY: INTRODUCTION TO THE SPECIAL ISSUE 1.06 41 6.83
OSUNMUYIWA O;KALFAGIAN... 2017 TRANSITIONS IN UNLIKELY PLACES: EXPLORING THE CONDITIONS FOR RENEWABLE ENERGY ADOPTION IN NIGERIA 1.29 32 6.40
HÖLSCHER K;WITTMAYER J... 2018 TRANSITION VERSUS TRANSFORMATION: WHAT'S THE DIFFERENCE? 0.28 138 34.50
Research Area 3: RA 3: unlabeled (n = 98, density =1.06)
BERGEK A;HEKKERT M;JAC... 2015 TECHNOLOGICAL INNOVATION SYSTEMS IN CONTEXTS: CONCEPTUALIZING CONTEXTUAL STRUCTURES AND INTERACTION DYNAMICS 3.21 300 42.86
HANSEN T;COENEN L 2015 THE GEOGRAPHY OF SUSTAINABILITY TRANSITIONS: REVIEW, SYNTHESIS AND REFLECTIONS ON AN EMERGENT RESEARCH FIELD 1.41 465 66.43
JACOBSSON S;BERGEK A 2011 INNOVATION SYSTEM ANALYSES AND SUSTAINABILITY TRANSITIONS: CONTRIBUTIONS AND SUGGESTIONS FOR RESEARCH 1.59 296 26.91
MARKARD J;HEKKERT M;JA... 2015 THE TECHNOLOGICAL INNOVATION SYSTEMS FRAMEWORK: RESPONSE TO SIX CRITICISMS 3.10 128 18.29
MURPHY JT 2015 HUMAN GEOGRAPHY AND SOCIO-TECHNICAL TRANSITION STUDIES: PROMISING INTERSECTIONS 2.10 170 24.29
QUITZOW R 2015 DYNAMICS OF A POLICY-DRIVEN MARKET: THE CO-EVOLUTION OF TECHNOLOGICAL INNOVATION SYSTEMS FOR SOLAR PHOTOVOLTAICS IN CHINA ... 1.08 141 20.14
TZIVA M;NEGRO SO;KALFA... 2020 UNDERSTANDING THE PROTEIN TRANSITION: THE RISE OF PLANT-BASED MEAT SUBSTITUTES 1.68 80 40.00
KERN F 2015 ENGAGING WITH THE POLITICS, AGENCY AND STRUCTURES IN THE TECHNOLOGICAL INNOVATION SYSTEMS APPROACH 1.61 64 9.14
WIRTH S;MARKARD J;TRUF... 2013 INFORMAL INSTITUTIONS MATTER: PROFESSIONAL CULTURE AND THE DEVELOPMENT OF BIOGAS TECHNOLOGY 1.14 80 8.89
WIECZOREK AJ;HEKKERT M... 2015 BROADENING THE NATIONAL FOCUS IN TECHNOLOGICAL INNOVATION SYSTEM ANALYSIS: THE CASE OF OFFSHORE WIND 1.56 58 8.29
Research Area 4: RA 4: unlabeled (n = 78, density =0.67)
TRUFFER B;MURPHY JT;RA... 2015 THE GEOGRAPHY OF SUSTAINABILITY TRANSITIONS: CONTOURS OF AN EMERGING THEME 0.73 152 21.71
BINZ C;COENEN L;MURPHY... 2020 GEOGRAPHIES OF TRANSITION—FROM TOPICAL CONCERNS TO THEORETICAL ENGAGEMENT: A COMMENTARY ON THE TRANSITIONS RESEARCH AGENDA 1.26 67 33.50
FEOLA G 2020 CAPITALISM IN SUSTAINABILITY TRANSITIONS RESEARCH: TIME FOR A CRITICAL TURN? 0.61 97 48.50
SENGERS F;RAVEN R 2015 TOWARD A SPATIAL PERSPECTIVE ON NICHE DEVELOPMENT: THE CASE OF BUS RAPID TRANSIT 0.55 108 15.43
COHEN N;ILIEVA RT 2015 TRANSITIONING THE FOOD SYSTEM: A STRATEGIC PRACTICE MANAGEMENT APPROACH FOR CITIES 0.81 68 9.71
VAN MIERLO B;BEERS PJ 2020 UNDERSTANDING AND GOVERNING LEARNING IN SUSTAINABILITY TRANSITIONS: A REVIEW 0.70 61 30.50
KIVIMAA P;LAAKSO S;LON... 2021 MOVING BEYOND DISRUPTIVE INNOVATION: A REVIEW OF DISRUPTION IN SUSTAINABILITY TRANSITIONS 0.86 45 45.00
TORRENS J;SCHOT J;RAVE... 2019 SEEDBEDS, HARBOURS, AND BATTLEGROUNDS: ON THE ORIGINS OF FAVOURABLE ENVIRONMENTS FOR URBAN EXPERIMENTATION WITH SUSTAINABI... 1.23 27 9.00
ROSENBLOOM D 2020 ENGAGING WITH MULTI-SYSTEM INTERACTIONS IN SUSTAINABILITY TRANSITIONS: A COMMENT ON THE TRANSITIONS RESEARCH AGENDA 0.71 39 19.50
MOSSBERG J;SÖDERHOLM P... 2018 CROSSING THE BIOREFINERY VALLEY OF DEATH? ACTOR ROLES AND NETWORKS IN OVERCOMING BARRIERS TO A SUSTAINABILITY TRANSITION 0.78 33 8.25
Research Area 5: RA 5: unlabeled (n = 72, density =0.73)
SEYFANG G;HIELSCHER S;... 2014 A GRASSROOTS SUSTAINABLE ENERGY NICHE? REFLECTIONS ON COMMUNITY ENERGY IN THE UK 1.07 266 33.25
PATTERSON J;SCHULZ K;V... 2017 EXPLORING THE GOVERNANCE AND POLITICS OF TRANSFORMATIONS TOWARDS SUSTAINABILITY 0.58 303 60.60
WITTMAYER JM;AVELINO F... 2017 ACTOR ROLES IN TRANSITION: INSIGHTS FROM SOCIOLOGICAL PERSPECTIVES 0.92 136 27.20
EHNERT F;KERN F;BORGST... 2018 URBAN SUSTAINABILITY TRANSITIONS IN A CONTEXT OF MULTI-LEVEL GOVERNANCE: A COMPARISON OF FOUR EUROPEAN STATES 1.55 77 19.25
LOORBACH D;WITTMAYER J... 2020 TRANSFORMATIVE INNOVATION AND TRANSLOCAL DIFFUSION 1.34 86 43.00
MARTISKAINEN M 2017 THE ROLE OF COMMUNITY LEADERSHIP IN THE DEVELOPMENT OF GRASSROOTS INNOVATIONS 0.94 111 22.20
FORREST N;WIEK A 2014 LEARNING FROM SUCCESS - TOWARD EVIDENCE-INFORMED SUSTAINABILITY TRANSITIONS IN COMMUNITIES 0.76 81 10.12
GEELS FW 2013 THE IMPACT OF THE FINANCIAL-ECONOMIC CRISIS ON SUSTAINABILITY TRANSITIONS: FINANCIAL INVESTMENT, GOVERNANCE AND PUBLIC DIS... 0.39 155 17.22
LONGHURST N 2015 TOWARDS AN 'ALTERNATIVE' GEOGRAPHY OF INNOVATION: ALTERNATIVE MILIEU, SOCIO-COGNITIVE PROTECTION AND SUSTAINABILITY EXPERI... 0.79 67 9.57
DE VRIES GW;BOON WPC;P... 2016 USER-LED INNOVATION IN CIVIC ENERGY COMMUNITIES 0.73 57 9.50

5.1 GPT-4 summary:

5.1.1 1: Sustainability Transitions and Innovations

This topic explores the dynamics of sustainability transitions and innovations within socio-technical systems, focusing on various aspects such as lock-in mechanisms, politics, niche construction, and business model perspectives. The articles adopt theoretical frameworks like the multi-level perspective (MLP) and analyze case studies across sectors such as energy, transport, and agriculture. The research is mostly qualitative, with an emphasis on understanding the complex interactions between actors, institutions, and technologies, and their implications for policy and industry.

5.1.2 2: Sustainability Transitions and Politics

This topic explores the interplay between sustainability transitions and politics in the context of socio-technical systems, policy processes, and governance. The articles encompass a range of theoretical frameworks, methodologies, and case studies, reflecting the multidisciplinary nature of the journal. Research in this topic is primarily qualitative, focusing on macro-level analysis with an emphasis on theoretical and policy implications. Contributions address various aspects of sustainability transitions, such as the role of the state, justice, incumbents, discourses, and innovation spaces, offering insights for understanding and supporting large-scale societal changes towards a sustainable future.

5.1.3 3: Sustainability Transitions and Innovation Systems

The common theme across these articles is the exploration of sustainability transitions through the lens of technological innovation systems (TIS) and their various interactions with contextual factors such as geography, politics, and institutions. These studies apply both qualitative and quantitative approaches, focusing on the macro level of socio-technical systems and their transition pathways. The research delves into the theoretical aspects of TIS and their implications for policy and industry, providing valuable insights into how technological, organizational, economic, and institutional innovations can contribute to a more environmentally sustainable economy.

5.1.4 4: Geographical Perspectives in Sustainability Transitions

These ten articles collectively focus on geographical perspectives in sustainability transitions, examining the spatial dimensions and multi-system interactions in transitioning socio-technical systems towards sustainability. The research primarily employs qualitative methods to study the dynamics of actor networks, urban experimentation, and niche development in various sectors and contexts. These contributions explore the importance of spatiality, place, and scale in understanding the complexities of sustainability transitions, while also considering the implications for policy, industry, and future research. By emphasizing the role of geography, this body of work helps to refine and extend the theoretical frameworks used in studying sustainability transitions.

5.1.5 5: Sustainability Transitions and Grassroots Innovations

Description: These articles focus on the role of grassroots innovations, community leadership, and governance in fostering sustainability transitions. They explore various aspects of socio-technical systems, multi-level governance, and alternative geographies of innovation that can facilitate the diffusion of environmentally sustainable practices. The research primarily employs qualitative case studies and draws on interdisciplinary perspectives from sociology, political science, and innovation studies. The articles contribute to both theoretical understanding and practical implications for policymakers, industry actors, and community leaders engaged in promoting sustainable transitions.

6 Knowledge Bases, Research Areas & Topics Interaction

6.1 Joint Overview over Knowledge Bases, Research Areas, and Topics

This plot shows the connection of publications in the research areas to knowledge bases (by citations) and topics (by gamma, document-topic weight)

8 Collaboration

8.1 Collaboration network

IGRAPH 11ba164 UNW- 26 70 -- 
+ attr: name (v/c), weight (e/n)
+ edges from 11ba164 (vertex names):
 [1] AALTO UNIVERSITY                  --LINKÖPING UNIVERSITY                         AALTO UNIVERSITY                  --UNIVERSITY OF SUSSEX                        
 [3] CHALMERS UNIVERSITY OF TECHNOLOGY --LINKÖPING UNIVERSITY                         CHALMERS UNIVERSITY OF TECHNOLOGY --SWISS FEDERAL INSTITUTE OF TECHNOLOGY ZURICH
 [5] CHALMERS UNIVERSITY OF TECHNOLOGY --UNIVERSITY OF SUSSEX                         CHALMERS UNIVERSITY OF TECHNOLOGY --UTRECHT UNIVERSITY                          
 [7] CLARK UNIVERSITY                  --UTRECHT UNIVERSITY                           DELFT UNIVERSITY OF TECHNOLOGY    --UNIVERSITY OF OSNABRÜCK                     
 [9] DELFT UNIVERSITY OF TECHNOLOGY    --UTRECHT UNIVERSITY                           EINDHOVEN UNIVERSITY OF TECHNOLOGY--ERASMUS UNIVERSITY ROTTERDAM                
[11] EINDHOVEN UNIVERSITY OF TECHNOLOGY--UNIVERSITY OF SUSSEX                         EINDHOVEN UNIVERSITY OF TECHNOLOGY--WUPPERTAL INSTITUTE FOR CLIMATE             
[13] EINDHOVEN UNIVERSITY OF TECHNOLOGY--ERASMUS UNIVERSITY ROTTERDAM                 ERASMUS UNIVERSITY ROTTERDAM      --UNIVERSITY OF AMSTERDAM                     
[15] ERASMUS UNIVERSITY ROTTERDAM      --UNIVERSITY OF SUSSEX                         ERASMUS UNIVERSITY ROTTERDAM      --WAGENINGEN UNIVERSITY                       
+ ... omitted several edges

9 Endnotes

R version 4.2.1 (2022-06-23)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Ventura 13.2.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.2/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] directlabels_2021.1.13 RColorBrewer_1.1-3     kableExtra_1.3.4       knitr_1.42             patchwork_1.1.2       
 [6] ggrepel_0.9.1          ggforce_0.4.1          plotly_4.10.1          ggraph_2.1.0           widyr_0.1.5           
[11] tsne_0.1-3.1           LDAvis_0.3.2           ldatuning_1.0.2        textstem_0.1.4         koRpus.lang.en_0.1-4  
[16] koRpus_0.13-8          sylly_0.1-6            topicmodels_0.2-12     tidytext_0.3.4         RNewsflow_1.2.6       
[21] Matrix_1.5-1           tm_0.7-9               NLP_0.2-1              igraph_1.3.5           tidygraph_1.2.2       
[26] bibliometrix_4.1.0     magrittr_2.0.3         forcats_0.5.2          stringr_1.5.0          dplyr_1.0.10          
[31] purrr_1.0.1            readr_2.1.3            tidyr_1.2.1            tibble_3.1.8           ggplot2_3.4.0         
[36] tidyverse_1.3.2       

loaded via a namespace (and not attached):
  [1] readxl_1.4.1           backports_1.4.1        systemfonts_1.0.4      servr_0.25             plyr_1.8.8            
  [6] lazyeval_0.2.2         gmp_0.7-1              crosstalk_1.2.0        SnowballC_0.7.0        digest_0.6.31         
 [11] htmltools_0.5.4        viridis_0.6.2          fansi_1.0.3            googlesheets4_1.0.1    cluster_2.1.3         
 [16] tzdb_0.3.0             openxlsx_4.2.5.1       graphlayouts_0.8.3     modelr_0.1.9           vroom_1.6.0           
 [21] svglite_2.1.0          colorspace_2.1-0       rvest_1.0.3            pubmedR_0.0.3          haven_2.5.1           
 [26] xfun_0.37              crayon_1.5.2           jsonlite_1.8.4         bibliometrixData_0.3.0 glue_1.6.2            
 [31] polyclip_1.10-4        gtable_0.3.1           gargle_1.2.1           emmeans_1.8.2          webshot_0.5.4         
 [36] Rmpfr_0.9-0            rentrez_1.2.3          scales_1.2.1           mvtnorm_1.1-3          DBI_1.1.3             
 [41] Rcpp_1.0.10            viridisLite_0.4.1      xtable_1.8-4           dimensionsR_0.0.3      flashClust_1.01-2     
 [46] bit_4.0.5              stats4_4.2.1           DT_0.26                htmlwidgets_1.6.1      httr_1.4.4            
 [51] ellipsis_0.3.2         modeltools_0.2-23      factoextra_1.0.7       pkgconfig_2.0.3        XML_3.99-0.12         
 [56] farver_2.1.1           sass_0.4.5             multcompView_0.1-8     dbplyr_2.2.1           utf8_1.2.2            
 [61] RJSONIO_1.3-1.7        tidyselect_1.2.0       labeling_0.4.2         rlang_1.0.6            reshape2_1.4.4        
 [66] later_1.3.0            cachem_1.0.6           munsell_0.5.0          cellranger_1.1.0       tools_4.2.1           
 [71] cli_3.6.0              generics_0.1.3         broom_1.0.1            evaluate_0.20          fastmap_1.1.0         
 [76] yaml_2.3.7             bit64_4.0.5            fs_1.6.1               zip_2.2.2              mime_0.12             
 [81] slam_0.1-50            leaps_3.1              xml2_1.3.3             tokenizers_0.2.3       compiler_4.2.1        
 [86] rstudioapi_0.14        reprex_2.0.2           syuzhet_1.0.6          tweenr_2.0.2           bslib_0.4.2           
 [91] stringi_1.7.12         highr_0.10             lattice_0.20-45        vctrs_0.5.2            stringdist_0.9.10     
 [96] pillar_1.8.1           lifecycle_1.0.3        rscopus_0.6.6          jquerylib_0.1.4        estimability_1.4.1    
[101] data.table_1.14.4      httpuv_1.6.6           sylly.en_0.1-3         R6_2.5.1               promises_1.2.0.1      
[106] gridExtra_2.3          janeaustenr_1.0.0      lexicon_1.2.1          MASS_7.3-57            assertthat_0.2.1      
[111] withr_2.5.0            parallel_4.2.1         hms_1.1.2              quadprog_1.5-8         grid_4.2.1            
[116] rmarkdown_2.20         googledrive_2.0.0      scatterplot3d_0.3-42   shiny_1.7.3            lubridate_1.8.0       
[121] FactoMineR_2.6        

—>

LS0tCnRpdGxlOiAiRUlTVCBNYXBwaW5nIDIwMjI6IEZpZWxkIE1hcHBpbmcgb2YgS25vd2xlZGdlIFN0cnVjdHVyZSIKYXV0aG9yOiAiRGFuaWVsIFMuIEhhaW4iCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVkICVCLCAlWScpYCIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0aGVtZTogZmxhdGx5CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGRmX3ByaW50OiBwYWdlZAogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlCiAgICB0b2M6IGZhbHNlCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBmYWxzZQpwYXJhbXM6CiAgICBpbnN0aXR1dGU6IAogICAgICAgdmFsdWU6IG51bGwKICAgIGRlcGFydG1lbnQ6CiAgICAgICB2YWx1ZTogbnVsbAotLS0KCjwhLS0tCiMgQWRkIHRvIFlBTUwgd2hlbiBjb21waWxpbmcgaHRtbCAtLTwgd2hlbiByZXZpZXdpbmcgY2hhbmdlIGZpcnN0IGxpbmUgdG86IGh0bWxfbm90ZWJvb2sKICBodG1sX2RvY3VtZW50OgogICAgdGhlbWU6IGZsYXRseQogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICBkZl9wcmludDogcGFnZWQKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgdG9jOiBmYWxzZQogICAgdG9jX2RlcHRoOiAzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogZmFsc2UKCiMgQWRkIHdoZW4gY29tcGlsaW5nIHBkZgojIEFkZCB0byBZQU1MIHdoZW4gY29tcGlsaW5nIGh0bWwKICAgYm9va2Rvd246OnBkZl9kb2N1bWVudDI6IAogICAgZmlnX2NhcHRpb246IHRydWUKICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQogICAgZ2xvYmFsX251bWJlcmluZzogdHJ1ZQotLS0+CgoKYGBgez1odG1sfQo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgoubWFpbi1jb250YWluZXIgewogIG1heC13aWR0aDogMTIwMHB4OwogIG1hcmdpbi1sZWZ0OiBhdXRvOwogIG1hcmdpbi1yaWdodDogYXV0bzsKfQo8L3N0eWxlPgpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQojIyMgR2VuZXJpYyBwcmVhbWJsZQojcm0obGlzdD1scygpKQpTeXMuc2V0ZW52KExBTkcgPSAiZW4iKQpvcHRpb25zKHNjaXBlbiA9IDUpCnNldC5zZWVkKDEzMzcpCgojIyMgTG9hZCBwYWNrYWdlcyAgCiMgZ2VuZXJhbApsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeSh3aWR5cikKCiMgS2libGlvICYgTlcKbGlicmFyeShiaWJsaW9tZXRyaXgpCmxpYnJhcnkodGlkeWdyYXBoKQpsaWJyYXJ5KGdncmFwaCkKbGlicmFyeShpZ3JhcGgpCgojIE5MUApsaWJyYXJ5KHRpZHl0ZXh0KQoKIyBEYXRhdml6CmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGdnZm9yY2UpCmxpYnJhcnkoZ2dyZXBlbCkKbGlicmFyeShwYXRjaHdvcmspCgojIEtuaXQKbGlicmFyeShrbml0cikgIyBGb3IgZGlzcGxheSBvZiB0aGUgbWFya2Rvd24KbGlicmFyeShrYWJsZUV4dHJhKSAjIEZvciB0YWJsZSBzdHlsaW5nCgojIG93biBmdW5jdGlvbnMKc291cmNlKCIuLi9mdW5jdGlvbnMvZnVuY3Rpb25zX2Jhc2ljLlIiKQpzb3VyY2UoIi4uL2Z1bmN0aW9ucy9mdW5jdGlvbnNfc3VtbWFyeS5SIikKc291cmNlKCIuLi9mdW5jdGlvbnMvMDBfcGFyYW1ldGVycy5SIikKCiMgS25pdHIgb3B0aW9ucwprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IEZBTFNFLCAKICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcgPSBGQUxTRSwgCiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gRkFMU0UpCmBgYAoKPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5FWFQgUEFSVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMgV2hlbiBkb2luZyBpdCBoZXJlIGluIHRoZSBub3RlYm9vawp2YXJfaW5zdCA8LSAnRUlTVCcKdmFyX2RlcHQgPC0gJ3YyJwoKIyBXaGVuIGNhbGxpbmcgZnJvbSBhIGhpZ2hlcnQgbGV2ZWwgc2NyaXB0CiN2YXJfaW5zdCA8LSBwYXJhbXMkaW5zdGl0dXRlCiN2YXJfZGVwdCA8LSBwYXJhbXMkZGVwYXJ0bWVudApgYGAKCiMgSW50cm9kdWN0aW9uOiBNYXBwaW5nIG9mIGJyb2FkIHJlc2VhcmNoIGZpZWxkIGFyb3VuZCBgciB2YXJfaW5zdGAgaW4gYHIgdmFyX2RlcHRgCgpIZXJlIGFyZSBwcmVsaW1pbmFyeSByZXN1bHRzIG9mIHRoZSBiaWJsaW9tZXRyaWMgbWFwcGluZyBvZiBFSVNULiBJdHMgcHVycG9zZSBpczoKCiogVG8gbWFwIHRoZSBicm9hZGVyIHJlc2VhcmNoIGNvbW11bml0eSBhbmQgZGlzdGluY3QgcmVzZWFyY2ggZmllbGQgdGhlIGRlcGFydG1lbnQgY29udHJpYnV0ZXMgdG8uCiogSWRlbnRpZnkgY29yZSBrbm93bGVkZ2UgYmFzZXMsIHJlc2VhcmNoIGFyZWFzIGd0cmVuZHMgYW5kIHRvcGljcy4KKiBIaWdobGlnaHQgdGhlIHBvc2l0aW9uaW5nIG9mIHRoZSBkZXBhcnRtZW50IHdpdGhpbiB0aGlzIGR5bmFtaWNzLgoKVGhlIG1ldGhvZCBmb3IgdGhlIHJlc2VhcmNoLWZpZWxkLW1hcHBpbmcgY2FuIGJlIHJldmlld2VkIGhlcmU6CgpbUmFrYXMsIE0uLCAmIEhhaW4sIEQuIFMuICgyMDE5KS4gVGhlIHN0YXRlIG9mIGlubm92YXRpb24gc3lzdGVtIHJlc2VhcmNoOiBXaGF0IGhhcHBlbnMgYmVuZWF0aCB0aGUgc3VyZmFjZT8uIFJlc2VhcmNoIFBvbGljeSwgNDgoOSksIDEwMzc4Ny5dKGh0dHBzOi8vZG9pLm9yZy8xMC4xMDE2L2oucmVzcG9sLjIwMTkuMDQuMDExKQoKKipOb3RlOioqIFRoZSBhbmFseXNpcyBpbiB0aGlzIGRvY3VtZW50IGRlcGljdHMgdGhlICpsYXJnZXIgcmVzZWFyY2ggZmllbGQqIGFyb3VuZCB0aGUgZGVwYXJ0bWVudCwgdGhlcmVieSBhbGwgYW5hbHlzaXMgcmVzdWx0cyBhcmUgYmFzZWQgb24gdGhlIHB1YmxpY2F0aW9ucyBvZiB0aGUgZGVwYXJ0bWVudCBwbHVzIHJlbGF0ZWQgCgoKPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5FWFQgUEFSVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMgTG9hZCBkYXRhCk0gPC0gcmVhZFJEUyhwYXN0ZTAoJy4uLy4uL3RlbXAvTV8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpICU+JSBhc190aWJibGUoKSAlPiUgCiAgZGlzdGluY3QoVVQsIC5rZWVwX2FsbCA9IFRSVUUpICU+JSAKICBmaWx0ZXIoUFkgPj0gUFlfbWluLCBQWSA8PSBQWV9tYXgpICU+JQogIGdyb3VwX2J5KFBZKSAlPiUKICAgIG11dGF0ZShUQ19jb2hvcnRfcmFuayA9IHBlcmNlbnRfcmFuayhUQykpICU+JQogIHVuZ3JvdXAoKSAKYGBgCgpgYGB7cn0KY29tX2xhYmVscyA8LSByZWFkX2NzdjIoJy4uL2RhdGEvY29tbXVuaXR5X2xhYmVsaW5nLmNzdicpICAlPiUgZmlsdGVyKGluc3RpdHV0ZSA9PSB2YXJfaW5zdCwgZGVwYXJ0bWVudCA9PSB2YXJfZGVwdCkgJT4lIGFycmFuZ2UoaW5zdGl0dXRlLCBkZXBhcnRtZW50LCB0eXBlLCBjb20pICU+JSBtdXRhdGUobGFiZWwgPSBpZmVsc2UoaXMubmEobGFiZWwpLCBwYXN0ZTAodHlwZSwgJyAnLCBjb20sICc6IHVubGFiZWxlZCcpLCBwYXN0ZTAodHlwZSwgJyAnLCBjb20sICc6ICcsIGxhYmVsKSkpCmBgYAoKCiMgR2VuZXJhbCBPdmVydmlldyBvdmVyIHRoZSByZXNlYXJjaCBmaWVsZAoKKipOb3RlOioqIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBiYXNpYyBkZXNjcmlwdGl2ZXMgb2YgdGggaWRlbnRpZmllZCByZXNlYXJjaCBmaWVsbGQsIGluY2x1ZGluZyBudW1iZXIgb2YgYXJ0aWNsZXMgb3ZlciB0aW1lLCBjb3VudHJpZXMsIGluc3RpdHV0aW9ucywgYW5kIGF1dGhvcnMuIFNlZSBgVGVjaG5pY2FsIGRlc2NyaXB0aW9uYGZvciBhZGRpdGlvbmFsIGV4cGxhbmF0aW9ucy4KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIHJlc3VsdHMgPC0gYmlibGlvQW5hbHlzaXMoTSwgc2VwID0gIjsiKQpyZXN1bHRzIDwtIHJlYWRfcmRzKHBhc3RlMCgnLi4vLi4vdGVtcC9NX3Jlc18nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpCmBgYAoKIyMgTWFpbiBJbmRpY2F0b3JzOiBQdWJsaWNhdGlvbnMsIEF1dGhvcnMsIENvdW50cmllcyAKCmBgYHtyfQojcmVzdWx0cyAlPiUgcGxvdChrID0gMTAsIHBhdXNlID0gRkFMU0UpCmBgYAoKYGBge3J9CnByb2RfQVUgPC0gTSAlPiUgYXV0aG9yUHJvZE92ZXJUaW1lKGsgPSAxMCwgZ3JhcGggPSBUUlVFKQojcGxvdChwcm9kX0FVJGdyYXBoKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpybShyZXN1bHRzLCBwcm9kX0FVKQpgYGAKCgoKYGBge3IsIGZpZy53aWR0aD0xNy41LCBmaWcuaGVpZ2h0PTE3LjV9CiMgIyBBdXRob3JzLCBrZXl3b3JkcywgY2l0YXRpb25zCiNNX3RocmVlZmllbGQgPC0gcmVhZFJEUyhwYXN0ZTAoJy4uLy4uL3RlbXAvdGhyZWVmaWVsZF8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpIAojTV90aHJlZWZpZWxkCmBgYAoKIyBUb3BpYyBtb2RlbGxpbmcgCgoqKk5vdGU6KiogSGVyZSwgd2UgcmVwb3J0IHRoZSByZXN1bHRzIG9mIGEgTERBIHRvcGljLW1vZGVsbGluZyAoYmFzaWNhbGx5LCBjbHVzdGVyaW5nIG9uIHdvcmRzKSBvbiBhbGwgdGl0bGUrYWJzdHJhY3QgdGV4dHMuIElkZW50aWZpZWQgdG9waWNzIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBicm9hZCB0aGVtZXMgaW4gdGhlIHJlc2VhcmNoIGZpZWxkLiBTZWUgYFRlY2huaWNhbCBkZXNjcmlwdGlvbmBmb3IgYWRkaXRpb25hbCBleHBsYW5hdGlvbnMuCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KdGV4dF90aWR5IDwtIHJlYWRSRFMocGFzdGUwKCcuLi8uLi90ZW1wL3RleHRfdGlkeV8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpCnRleHRfbGRhIDwtIHJlYWRSRFMocGFzdGUwKCcuLi8uLi90ZW1wL3RleHRfTERBXycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy5yZHMnKSkgCgp0ZXh0X2xkYV9iZXRhIDwtIHRleHRfbGRhICU+JSB0aWR5KG1hdHJpeCA9ICJiZXRhIikgCnRleHRfbGRhX2dhbW1hIDwtIHRleHRfbGRhICU+JSB0aWR5KG1hdHJpeCA9ICJnYW1tYSIpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmNvbV9uYW1lc190b3AgPC0gdGliYmxlKCAKICBjb20gPSAxOih0ZXh0X2xkYV9nYW1tYSAlPiUgcHVsbCh0b3BpYykgJT4lIG5fZGlzdGluY3QoKSksCiAgdHlwZSA9ICdUUCcsCiAgY29sID0gY29tICU+JSBnZ19jb2xvcl9zZWxlY3QocGFsID0gcGFsX3RwKSkgJT4lCiAgbGVmdF9qb2luKGNvbV9sYWJlbHMgJT4lIGZpbHRlcih0eXBlID09ICdUUCcpICU+JSBzZWxlY3QoY29tLCBsYWJlbCksIGJ5ID0gJ2NvbScpICU+JQogIG11dGF0ZShsYWJlbCA9IGlmZWxzZShpcy5uYShsYWJlbCksIHBhc3RlMCgnVFAgJywgY29tLCAnOiB1bmxhYmVsZWQnKSwgbGFiZWwpKQogICAgICAgICAgICAKIyAjIDFzdCBhbHRlcm5hdGl2ZTogTnVtYmVyIHRoZW0gMS1uCiMgcGFzdGUodHlwZSwgMToodGV4dF9sZGFfZ2FtbWEgJT4lIHB1bGwodG9waWMpICU+JSBuX2Rpc3RpbmN0KCkpKSAgICAgICAgICAgCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CnRleHRfbGRhX2JldGEgJTw+JSAgaW5uZXJfam9pbihjb21fbmFtZXNfdG9wICU+JSBzZWxlY3QoY29tLCBsYWJlbCwgY29sKSwgYnkgPSBjKCd0b3BpYycgPSAnY29tJykpCnRleHRfbGRhX2dhbW1hICU8PiUgaW5uZXJfam9pbihjb21fbmFtZXNfdG9wICU+JSBzZWxlY3QoY29tLCBsYWJlbCwgY29sKSwgYnkgPSBjKCd0b3BpYycgPSAnY29tJykpCmBgYAoKCiMjIFRvcGljcyBieSB0b3B3b3JkcwoKYGBge3IsIGZpZy53aWR0aD0xNSwgZmlnLmhlaWdodD0xNX0gCnRleHRfbGRhX2JldGEgJT4lCiAgZ3JvdXBfYnkobGFiZWwpICU+JQogIHNsaWNlX21heChiZXRhLCBuID0gMTApICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodGVybSA9IHJlb3JkZXJfd2l0aGluKHRlcm0sIGJldGEsIGxhYmVsKSkgJT4lCiAgZ2dwbG90KGFlcyh0ZXJtLCBiZXRhLCBmaWxsID0gZmFjdG9yKGxhYmVsKSkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZmFjZXRfd3JhcCh+IGxhYmVsLCBzY2FsZXMgPSAiZnJlZSIsIG5jb2wgPSAzKSArCiAgY29vcmRfZmxpcCgpICsKICBzY2FsZV94X3Jlb3JkZXJlZCgpICsKICBsYWJzKHggPSAiSW50cmEtdG9waWMgZGlzdHJpYnV0aW9uIG9mIHdvcmQiLAogICAgICAgeSA9ICJXb3JkcyBpbiB0b3BpYyIpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJMZWdlbmQiLCB2YWx1ZXMgPSBjb21fbmFtZXNfdG9wICU+JSBwdWxsKGNvbCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykKCiNwbG90X2x5IDwtIHBsb3QgJT4lIHBsb3RseTo6Z2dwbG90bHkoKQojaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQocGxvdGx5Ojphc193aWRnZXQocGxvdF9seSksICcuLi9vdXRwdXRcdmlzX3Bsb3RseV90b3BpY190ZXJtcy5odG1sJywgc2VsZmNvbnRhaW5lZCA9IFRSVUUpCmBgYAoKKipOb3RlOioqIFdoaWxlIHRoaXMgc3RhdGljIHZpZXMgaXMgaGVscGZ1bCwgSSByZWNvbW1lbmQgdXNpbmcgdGhlIGludGVyYWN0aXZlIExEQVZpcyB2ZXJzaW9uIHRvIGJlIGZvdW5kIHVuZGVyIGByIHBhc3RlMCgnaHR0cHM6Ly9kYW5pZWwtaGFpbi5naXRodWIuaW8vYmlibGlvX2x1eF8yMDIyL291dHB1dC90b3BpY19tb2RlbGxpbmcvTERBdml6XycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy9pbmRleC5odG1sI3RvcGljPTEmbGFtYmRhPTAuNjAmdGVybT0nKWAuIEZvciBmdW5jdGlvbmFsaXR5IGFuZCB1c2FnZSwgc2VlIMK0VGVjaG5pY2FsIMK0LgoKYGBge3IsIGZpZy53aWR0aCA9IDE1LCBmaWcuaGVpZ2h0PTcuNX0KdGV4dF9sZGFfZ2FtbWEgJT4lCiAgcmVuYW1lKHdlaWdodCA9IGdhbW1hKSAlPiUKICBsZWZ0X2pvaW4oTSAlPiUgc2VsZWN0KFVULCBQWSksIGJ5ID0gYygnZG9jdW1lbnQnID0gJ1VUJykpICU+JQogIG11dGF0ZShQWSA9IGFzLm51bWVyaWMoUFkpKSAlPiUKICBncm91cF9ieShQWSwgbGFiZWwpICU+JSBzdW1tYXJpc2Uod2VpZ2h0ID0gc3VtKHdlaWdodCkpICU+JSB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkoUFkpICU+JSBtdXRhdGUod2VpZ2h0X1BZID0gc3VtKHdlaWdodCkpICU+JSB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHdlaWdodF9yZWwgPSB3ZWlnaHQgLyB3ZWlnaHRfUFkpICU+JQogIHNlbGVjdChQWSwgbGFiZWwsIHdlaWdodCwgd2VpZ2h0X3JlbCkgJT4lCiAgZmlsdGVyKFBZID49IFBZX21pbiAmIFBZIDw9IFBZX21heCkgJT4lCiAgYXJyYW5nZShQWSwgbGFiZWwpICU+JQogIHBsb3Rfc3VtbWFyeV90aW1lbGluZSh5MSA9IHdlaWdodCwgeTIgPSB3ZWlnaHRfcmVsLCB0ID0gUFksIHRfbWluID0gUFlfbWluLCB0X21heCA9IFBZX21heCwgYnkgPSBsYWJlbCwgIGxhYmVsID0gVFJVRSwgcGFsID0gcGFsX3RwLCAKICAgICAgICAgICAgICAgICAgICAgICAgeTFfdGV4dCA9ICJUb3BpYyBwb3B1bGFyaXR5IGFubnVhbHkiLCB5Ml90ZXh0ID0gIlNoYXJlIG9mIHRvcGljIGFubnVhbGx5IikgKwogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHBhc3RlKCdUb3BpYyBNb2RlbGxpbmc6JywgdmFyX2luc3QsICdGaWVsZCBhcm91bmQgRGVwdC4nLCB2YXJfZGVwdCwgc2VwID0gJyAnKSwKICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBwYXN0ZSgnVGltZWZyYW1lOicsIFBZX21pbiwgJy0nLCBQWV9tYXggLCBzZXAgPSAnICcpLAogICAgICAgICAgICAgICAgICBjYXB0aW9uID0gJ0Fic29sdXRlIHRvcGljIGFwcGVhcmFuY2UgKGxlZnQpLCBSZWxhdGl2ZSB0b3BpYyBhcHBlYXJhbmNlIChyaWdodCknKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodD03LjV9CnRleHRfbGRhX2dhbW1hICU+JQogIHJlbmFtZSh3ZWlnaHQgPSBnYW1tYSkgJT4lCiAgaW5uZXJfam9pbihNICU+JSBzZWxlY3QoVVQsIFBZLCBUQ19jb2hvcnRfcmFuaykgJT4lCiAgICAgICAgICAgICAgZmlsdGVyKGludF9kZXB0ID0gVFJVRSksIGJ5ID0gYygnZG9jdW1lbnQnID0gJ1VUJykpICU+JQogICMgbXV0YXRlKGltcGFjdCA9IHdlaWdodCogVENfY29ob3J0X3JhbmspICU+JQogIG11dGF0ZShpbXBhY3QgPSBUQ19jb2hvcnRfcmFuayA+PSAwLjkpICU+JQogIGdyb3VwX2J5KFBZKSAlPiUKICBmaWx0ZXIocGVyY2VudF9yYW5rKHdlaWdodCkgPj0gMC41KSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgZ3JvdXBfYnkobGFiZWwsIFBZKSAlPiUKICBzdW1tYXJpc2UoaW1wYWN0ID0gbWVhbihpbXBhY3QpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBQWSwgeSA9IGltcGFjdCwgY29sID0gbGFiZWwpKSArCiAgZ2VvbV9saW5lKCkgKyAKICBnZW9tX3BvaW50KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgnVG9waWMgSW1wYWN0OicsIHZhcl9pbnN0LCAnRmllbGQgYXJvdW5kIERlcHQuJywgdmFyX2RlcHQsIHNlcCA9ICcgJyksCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoJ1RpbWVmcmFtZTonLCBQWV9taW4sICctJywgUFlfbWF4ICwgc2VwID0gJyAnKSwKICAgICAgICAgICAgICAgICAgeCA9ICdZZWFyJywKICAgICAgICAgICAgICAgICAgeSA9ICdUb3BpYyBJbXBhY3QnLAogICAgICAgICAgICAgICAgICBjYXB0aW9uID0gJ1RvcGljIEltcGFjdCByZWZlcnMgdG8gdGhlIHNoYXJlIG9mIHB1YmxpY2F0aW9ucyB3aXRoaW4gdGhlIGNvaG9ydCB0b3AtMTAlIGNpdGVkIHB1YmxpY2F0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIHRvcGljJywKICAgICAgICAgICAgICAgICAgKQpgYGAKCjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBORVhUIFBBUlQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0Kcm0odGV4dF90aWR5LCB0ZXh0X2xkYSkKYGBgCgojIEtub3dsZWRnZSBCYXNlczogQ28tQ2l0YXRpb24gbmV0d29yayBhbmFseXNpcyAKCioqTm90ZToqKiBUaGlzIGFuYWx5c2lzIHJlZmVycyB0aGUgY28tY2l0YXRpb24gYW5hbHlzaXMsIHdoZXJlIHRoZSBjaXRlZCByZWZlcmVuY2VzIGFuZCBub3QgdGhlIG9yaWdpbmFsIHB1YmxpY2F0aW9ucyBhcmUgdGhlIHVuaXQgb2YgYW5hbHlzaXMuIElkZW50aWZpZWQga25vd2xlZGdlIGJhc2VzIGNhbiBiZSBpbnRlcnByZXRlZCBhcyB0aGUga25vd2xlZGdlIGZvdW5kYXRpb24gdGhlIGZpZWxkIGRyYXdzIGZyb20uIFNlZSBgVGVjaG5pY2FsIGRlc2NyaXB0aW9uYGZvciBhZGRpdGlvbmFsIGV4cGxhbmF0aW9ucy4KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpDX253IDwtIHJlYWRSRFMocGFzdGUwKCcuLi8uLi90ZW1wL0NfbndfJywgc3RyX3RvX2xvd2VyKHZhcl9pbnN0KSwgJ18nLCBzdHJfdG9fbG93ZXIodmFyX2RlcHQpLCAnLnJkcycpKSAgJT4lCiAgZHJvcF9uYShjb20pCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmNvbV9uYW1lc19jaXQgPC0gdGliYmxlKCAKICBjb20gPSAxOihDX253ICU+JSBwdWxsKGNvbSkgJT4lIG5fZGlzdGluY3QoKSksCiAgdHlwZSA9ICdLQicsCiAgY29sID0gY29tICU+JSBnZ19jb2xvcl9zZWxlY3QocGFsID0gcGFsX2tiKSkgJT4lCiAgbGVmdF9qb2luKGNvbV9sYWJlbHMgJT4lIGZpbHRlcih0eXBlID09ICdLQicpICU+JSBzZWxlY3QoY29tLCBsYWJlbCksIGJ5ID0gJ2NvbScpICU+JQogIG11dGF0ZShsYWJlbCA9IGlmZWxzZShpcy5uYShsYWJlbCksIHBhc3RlMCgnS0IgJywgY29tLCAnOiB1bmxhYmVsZWQnKSwgbGFiZWwpKQoKIyAjIDFzdCBhbHRlcm5hdGl2ZTogTnVtYmVyIHRoZW0gMS1uCiMgcGFzdGUodHlwZSwgMTooQ19udyAlPiUgcHVsbChjb20pICU+JSBuX2Rpc3RpbmN0KCkpKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpDX253ICU8PiUgbGVmdF9qb2luKGNvbV9uYW1lc19jaXQgJT4lIHNlbGVjdChjb20sIGxhYmVsLCBjb2wpLCBieSA9ICJjb20iKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQprYl9zdGF0cyA8LSBDX253ICU+JQogIGdyb3VwX2J5KGxhYmVsKSAlPiUKICBzdW1tYXJpc2UobiA9IG4oKSwgZGVuc2l0eV9pbnQgPSAoKHN1bShkZ3JfaW50KSAvIChuKCkgKiAobigpIC0gMSkpKSAqIDEwMCkgJT4lIHJvdW5kKDMpKSAlPiUKICByZWxvY2F0ZShsYWJlbCwgZXZlcnl0aGluZygpKQpgYGAKCmBgYHtyfQprYl9zdW0gPC1DX253ICU+JSBncm91cF9ieShjb20pICU+JSAKICBhcnJhbmdlKGNvbSwgZGVzYyhkZ3JfaW50KSkgJT4lCiAgbXV0YXRlKG5hbWUgPSBuYW1lICU+JSBzdHJfdHJ1bmMoMTUwKSkgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gZGdyX2ludCwgbiA9IDEwLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoIG5hbWUsIGRncl9pbnQsIGRncikgJT4lCiAga2FibGUoKSAKCmZvcihpIGluIDE6bnJvdyhjb21fbmFtZXNfY2l0KSl7CiAga2Jfc3VtIDwtIGtiX3N1bSAlPiUKICAgIHBhY2tfcm93cyhwYXN0ZTAoJ0tub3dsZWRnZSBCYXNlICcsIGksICc6ICcsIGNvbV9uYW1lc19jaXRbaSwgJ2xhYmVsJ10sCiAgICAgICAgICAgICAgICAgICAgICcgICAobiA9ICcsIGtiX3N0YXRzW2ksICduJ10sICcsIGRlbnNpdHkgPScsIGtiX3N0YXRzW2ksICdkZW5zaXR5X2ludCddICU+JSByb3VuZCgyKSwgJyknICksIAogICAgICAgICAgICAgIChpKjEwLTkpLCAgKGkqMTApLCBsYWJlbF9yb3dfY3NzID0gImJhY2tncm91bmQtY29sb3I6ICM2NjY7IGNvbG9yOiAjZmZmOyIpIAogIH0KCmtiX3N1bSAlPiUKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLCBmb250X3NpemUgPSAxMCkKYGBgCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KZWxfMm0gPC0gcmVhZFJEUyhwYXN0ZTAoJy4uLy4uL3RlbXAvZWxfMm1fJywgc3RyX3RvX2xvd2VyKHZhcl9pbnN0KSwgJ18nLCBzdHJfdG9fbG93ZXIodmFyX2RlcHQpLCAnLnJkcycpKSAlPiUKICBkcm9wX25hKCkKYGBgCgoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmNpdF9jb21feWVhciA8LSBlbF8ybSAlPiUKICBjb3VudChjb21fY2l0LCBQWSwgbmFtZSA9ICdUQycpICU+JQogIGdyb3VwX2J5KFBZKSAlPiUKICBtdXRhdGUoVENfcmVsID0gVEMgLyBzdW0oVEMpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShQWSwgY29tX2NpdCkgJT4lCiAgbGVmdF9qb2luKGNvbV9uYW1lc19jaXQgLCBieSA9IGMoJ2NvbV9jaXQnID0gJ2NvbScpKSAlPiUgCiAgY29tcGxldGUobGFiZWwsIFBZLCBmaWxsID0gbGlzdChUQyA9IDAsIFRDX3JlbCA9IDApKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodD03LjV9CmNpdF9jb21feWVhciAlPiUKICBwbG90X3N1bW1hcnlfdGltZWxpbmUoeTEgPSBUQywgeTIgPSBUQ19yZWwsIHQgPSBQWSwgdF9taW4gPSBQWV9taW4sIHRfbWF4ID0gUFlfbWF4LCBieSA9IGxhYmVsLCBwYWwgPSBwYWxfa2IsIGxhYmVsID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgeTFfdGV4dCA9ICJOdW1iZXIgY2l0YXRpb25zIHJlY2lldmVkIGFubnVhbGx5IiwgIHkyX3RleHQgPSAiU2hhcmUgb2YgY2l0YXRpb25zIHJlY2lldmVkIGFubnVhbGx5IikgKwogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHBhc3RlKCdLbm93bGVkZ2UgQnNlczonLCB2YXJfaW5zdCwgJ0ZpZWxkIGFyb3VuZCBEZXB0LicsIHZhcl9kZXB0LCBzZXAgPSAnICcpLAogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCdUaW1lZnJhbWU6JywgUFlfbWluLCAnLScsIFBZX21heCAsIHNlcCA9ICcgJyksCiAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAnQWJzb2x1dGUga25vd2xlZGdlIGJhc2UgYXBwZWFyYW5jZSAobGVmdCksIFJlbGF0aXZlIGtub3dsZWRnZSBiYXNlIGFwcGVhcmFuY2UgKHJpZ2h0KScpCmBgYAoKPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIE5FWFQgUEFSVCAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgoKIyBSZXNlYXJjaCBBcmVhczogQmlibGlvZ3JhcGhpYyBjb3VwbGluZyBhbmFseXNpcwoKKipOb3RlOioqIFRoaXMgYW5hbHlzaXMgcmVmZXJzIHRoZSBiaWJsaW9ncmFwaGljIGNvdXBsaW5nIGFuYWx5c2lzLCB3aGVyZSBvcmlnaW5hbCBwdWJsaWNhdGlvbnMgYXJlIHRoZSB1bml0IG9mIGFuYWx5c2lzLiBJZGVudGlmaWVkIHJlc2VhcmNoIGFyZWFzIGNhbiBiZSBpbnRlcnByZXRlZCBhcyB0aGUgZmllbGQncyBjdXJyZW50IHJlc2VhcmNoIGZyb250aWVyLiBTZWUgYFRlY2huaWNhbCBkZXNjcmlwdGlvbmBmb3IgYWRkaXRpb25hbCBleHBsYW5hdGlvbnMuCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KTV9iaWIgPC0gcmVhZFJEUyhwYXN0ZTAoJy4uLy4uL3RlbXAvTV9iaWJfJywgc3RyX3RvX2xvd2VyKHZhcl9pbnN0KSwgJ18nLCBzdHJfdG9fbG93ZXIodmFyX2RlcHQpLCAnLnJkcycpKSAlPiUgCiAgYXNfdGliYmxlKCkgJT4lCiAgZHJvcF9uYShjb20pCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CmNvbV9uYW1lc19iaWIgPC0gdGliYmxlKCAKICBjb20gPSAxOihNX2JpYiAlPiUgcHVsbChjb20pICU+JSBuX2Rpc3RpbmN0KCkpLAogIHR5cGUgPSAnUkEnLAogIGNvbCA9IGNvbSAlPiUgZ2dfY29sb3Jfc2VsZWN0KHBhbCA9IHBhbF9yYSkpICU+JQogIGxlZnRfam9pbihjb21fbGFiZWxzICU+JSBmaWx0ZXIodHlwZSA9PSAnUkEnKSAlPiUgc2VsZWN0KGNvbSwgbGFiZWwpLCBieSA9ICdjb20nKSAlPiUKICBtdXRhdGUobGFiZWwgPSBpZmVsc2UoaXMubmEobGFiZWwpLCBwYXN0ZTAoJ1JBICcsIGNvbSwgJzogdW5sYWJlbGVkJyksIGxhYmVsKSkKCiMgIyAxc3QgYWx0ZXJuYXRpdmU6IE51bWJlciB0aGVtIDEtbgojIHBhc3RlKHR5cGUsIDE6KE1fYmliICU+JSBwdWxsKGNvbSkgJT4lIG5fZGlzdGluY3QoKSkpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9Ck1fYmliICU8PiUgbGVmdF9qb2luKGNvbV9uYW1lc19iaWIgJT4lIHNlbGVjdChjb20sIGxhYmVsLCBjb2wpLCBieSA9ICJjb20iKQpgYGAKCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpyYV9zdGF0cyA8LSBNX2JpYiAlPiUKICBkcm9wX25hKGNvbSkgJT4lCiAgZ3JvdXBfYnkoY29tLCBsYWJlbCkgJT4lCiAgc3VtbWFyaXNlKG4gPSBuKCksIGRlbnNpdHlfaW50ID0gKChzdW0oZGdyX2ludCkgLyAobigpICogKG4oKSAtIDEpKSkgKiAxMDApICU+JSByb3VuZCgzKSkgJT4lCiAgc2VsZWN0KGNvbSwgbGFiZWwsIGV2ZXJ5dGhpbmcoKSkKYGBgCgpgYGB7cn0KcmFfc3VtIDwtIE1fYmliICU+JSAKICBsZWZ0X2pvaW4oTSAlPiUgc2VsZWN0KFVULCBBVSwgUFksIFRJLCBUQyksIGJ5ID0gJ1VUJykgJT4lCiAgZ3JvdXBfYnkobGFiZWwpICU+JSAKICBtdXRhdGUoZGdyX3NlbGVjdCA9IChkZ3JfaW50IC8gbWF4KGRncl9pbnQpICogKFRDIC8gbWF4KFRDKSkpICkgJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gZGdyX3NlbGVjdCwgbiA9IDEwLCB3aXRoX3RpZXMgPSBGQUxTRSkgJT4lIAogIG11dGF0ZShUQ195ZWFyID0gKFRDIC8gKDIwMjEgKyAxIC0gUFkpKSAlPiUgcm91bmQoMiksCiAgICAgICAgIGRncl9pbnQgPSBkZ3JfaW50ICU+JSByb3VuZCgyKSwKICAgICAgICAgQVUgPSBBVSAlPiUgc3RyX3RydW5jKDI1KSwKICAgICAgICAgVEkgPSBUSSAlPiUgc3RyX3RydW5jKDEyNSkpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzZWxlY3QoQVUsIFBZLCBUSSwgZGdyX2ludCwgVEMsIFRDX3llYXIpICU+JQogIGthYmxlKCkKCgpmb3IoaSBpbiAxOm5yb3coY29tX25hbWVzX2JpYikpewogIHJhX3N1bSAgJTw+JQogICAgcGFja19yb3dzKHBhc3RlMCgnUmVzZWFyY2ggQXJlYSAnLCBpLCAnOiAnLCBjb21fbmFtZXNfYmliW2ksICdsYWJlbCddLAogICAgICAgICAgICAgICAgICAgICAnICAgKG4gPSAnLCByYV9zdGF0c1tpLCAnbiddLCAnLCBkZW5zaXR5ID0nLCByYV9zdGF0c1tpLCAnZGVuc2l0eV9pbnQnXSAlPiUgcm91bmQoMiksICcpJyApLCAKICAgICAgICAgICAgICAoaSoxMC05KSwgIChpKjEwKSwgbGFiZWxfcm93X2NzcyA9ICJiYWNrZ3JvdW5kLWNvbG9yOiAjNjY2OyBjb2xvcjogI2ZmZjsiKSAKICB9CgpyYV9zdW0gJT4lIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZvbnRfc2l6ZSA9IDEwKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxNSwgZmlnLmhlaWdodD03LjV9Ck1fYmliICU+JQogIGxlZnRfam9pbihNICU+JSBzZWxlY3QoWFgsIFBZKSwgYnkgPSAnWFgnKSAlPiUKICBtdXRhdGUoUFkgPSBQWSAlPiUgYXMubnVtZXJpYygpKSAlPiUKICBncm91cF9ieShsYWJlbCwgUFkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIHVuZ3JvdXAoKSAlPiUKICBncm91cF9ieShQWSkgJT4lIG11dGF0ZShuX1BZID0gc3VtKG4pKSAlPiUgdW5ncm91cCgpICU+JQogIG11dGF0ZShuX3JlbCA9IG4gLyBuX1BZKSAlPiUKICBzZWxlY3QobGFiZWwsIFBZLCBuLCBuX3JlbCkgJT4lCiAgYXJyYW5nZShsYWJlbCwgUFkpICU+JSAKICBjb21wbGV0ZShsYWJlbCwgUFksIGZpbGwgPSBsaXN0KG4gPSAwLCBuX3JlbCA9IDApKSAlPiUKICBwbG90X3N1bW1hcnlfdGltZWxpbmUoeTEgPSBuLCB5MiA9IG5fcmVsLCB0ID0gUFksIHRfbWluID0gUFlfbWluLCB0X21heCA9IFBZX21heCwgYnkgPSBsYWJlbCwgbGFiZWwgPSBUUlVFLCBwYWwgPSBwYWxfcmEsCiAgICAgICAgICAgICAgICAgICAgICAgIHkxX3RleHQgPSAiTnVtYmVyIHB1YmxpY2F0aW9ucyBhbm51YWxseSIsIHkyX3RleHQgPSAiU2hhcmUgb2YgcHVibGljYXRpb25zIGFubnVhbGx5IikgKwogIHBsb3RfYW5ub3RhdGlvbih0aXRsZSA9IHBhc3RlKCdSZXNlYXJjaCBBcmVhczonLCB2YXJfaW5zdCwgJ0ZpZWxkIGFyb3VuZCBEZXB0LicsIHZhcl9kZXB0LCBzZXAgPSAnICcpLAogICAgICAgICAgICAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCdUaW1lZnJhbWU6JywgUFlfbWluLCAnLScsIFBZX21heCAsIHNlcCA9ICcgJyksCiAgICAgICAgICAgICAgICAgIGNhcHRpb24gPSAnQWJzb2x1dGUgcmVzZWFyY2ggYXJlYSBhcHBlYXJhbmNlIChsZWZ0KSwgUmVsYXRpdmUgcmVzZWFyY2ggYXJlYSBhcHBlYXJhbmNlIChyaWdodCknKQpgYGAKCgpgYGB7ciwgaW5jbHVkZT1GQUxTRX0KZ19hZ2cgPC0gcmVhZFJEUyhwYXN0ZTAoJy4uLy4uL3RlbXAvZ19iaWJfYWdnXycsIHN0cl90b19sb3dlcih2YXJfaW5zdCksICdfJywgc3RyX3RvX2xvd2VyKHZhcl9kZXB0KSwgJy5yZHMnKSkgJU4+JQogIGFycmFuZ2UoY29tKSAjICU+JQojICAgbXV0YXRlKG5hbWUgPSBuYW1lc19yYSAlPiUgcHVsbChjb21fcmFfbmFtZSksCiMgICAgICAgICAgY29sb3IgPSBjb2xzX3JhKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PSA3LjUsIGZpZy53aWR0aD03LjV9CmdfYWdnICVFPiUgCiAgZmlsdGVyKHdlaWdodCA+IDAgJiBmcm9tICE9IHRvKSAlPiUKICBmaWx0ZXIod2VpZ2h0ID49IHF1YW50aWxlKHdlaWdodCwgMC4yNSkgKSAgJU4+JQogIG11dGF0ZShjb20gPSBjb21fbmFtZXNfYmliICU+JSBwdWxsKGxhYmVsKSkgJT4lCiAgZ2dyYXBoKGxheW91dCA9ICJjaXJjbGUiKSArIAogIGdlb21fZWRnZV9mYW4oc3RyZW5naHQgPSAwLjgsIGFlcyh3aWR0aCA9IHdlaWdodCksIGFscGhhID0gMC4yKSAgKyAKICBnZW9tX25vZGVfcG9pbnQoYWVzKHNpemUgPSBOLCBjb2xvciA9IGNvbSkpICArIAogIGdlb21fbm9kZV90ZXh0KGFlcyhsYWJlbCA9IGNvbSksIHJlcGVsID0gVFJVRSkgKwogICN0aGVtZV9ncmFwaChiYXNlX2ZhbWlseSA9ICJBcmlhbCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKwogIHNjYWxlX3NpemUocmFuZ2UgPSBjKDIsMjApKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSBwYWxfcmEpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoJ1Jlc2VhcmNoIEFyZWEgQ29ubmVjdGl2aXR5OicsIHZhcl9pbnN0LCAnRmllbGQgYXJvdW5kIERlcHQuJywgdmFyX2RlcHQsIHNlcCA9ICcgJyksCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gcGFzdGUoJ1RpbWVmcmFtZTonLCBQWV9taW4sICctJywgUFlfbWF4ICwgc2VwID0gJyAnKSwKICAgICAgICAgICAgICAgICAgY2FwdGlvbiA9ICdOb2RlcyA9IElkZW50aWZpZWQgUmVzZWFyY2ggQXJlYXM7IEVkZ2VzOiBCaWJsaW9ncmFwaGljIGNvdXBsaW5nIHN0cmVuZ2h0IChKYWNjYXJkIHdlaWdodGVkKScpCmBgYAoKIyMgR1BULTQgc3VtbWFyeTogCgpgYGB7cn0KZG9jc190b3AgPC0gTV9iaWIgJT4lIAogIGxlZnRfam9pbihNICU+JSBzZWxlY3QoVVQsVEksIEFCLCBUQyksIGJ5ID0gJ1VUJykgJT4lCiAgZ3JvdXBfYnkoY29tKSAlPiUgCiAgbXV0YXRlKGRncl9zZWxlY3QgPSAoZGdyX2ludCAvIG1heChkZ3JfaW50KSAqIChUQyAvIG1heChUQykpKSApICU+JQogIHNsaWNlX21heChvcmRlcl9ieSA9IGRncl9zZWxlY3QsIG4gPSBuX2RvYywgd2l0aF90aWVzID0gRkFMU0UpICU+JSAKICB1bmdyb3VwKCkgICU+JQogIG11dGF0ZSh0ZXh0ID0gcGFzdGUwKCcgLSAnLCBUSSwgJy4gJywgQUIpICU+JSAKICAgICAgICAgICBzdHJfdG9fbG93ZXIoKSAlPiUgCiAgICAgICAgICAgc3RyX3JlbW92ZV9hbGwoIsKpLioiKSAlPiUgICAgICAgICAgCiAgICAgICAgICAgc3RyX3JlbW92ZV9hbGwoIi8oJnRyYWRlO3wmcmVnO3wmY29weTt8JiM4NDgyO3wmIzE3NDt8JiMxNjk7KS8uKiIpICU+JQogICAgICAgICAgIHN0cl9yZW1vdmVfYWxsKCcoJmVsc2V2aWVyO3wmc3ByaW5nZXI7fCZyaWdodHMgcmVzZXJ2ZWQpLy4qJykgJT4lCiAgICAgICAgICAgc3RyX3NxdWlzaCgpKSAlPiUKICBzZWxlY3QoY29tLCB0ZXh0KQoKcHJvbXRfaW50cm8gPSAiSSB3YW50IHlvdSB0byBhY3QgYXMgYSBwcm9mZXNzb3IgaW4gc29jaWFsIHNjaWVuY2UuIEkgd2FudCB5b3UgdG8gaWRlbnRpZnkgdGhlIHJlZWFyY2ggdG9waWMgb2YgZm9sbG93aW5nIGRvY3VtZW50cywgd2hpY2ggYXJlIHRpdGxlcyBwbHVzIGFic3RhY3RzIG9mIHNjaWVudGlmaWMgam91cm5hbCBhcnRpY2xlIHB1YmxpY2F0aW9ucy4gVGhleSBhcmUgcmVwcmVzZW50YXRpdmUgYXJ0aWNsZXMgZm9yIHRoZSB0b3BpYyB0byBiZSBpZGVudGlmaWVkLiBUaGUgam91cm5hbCBpcyBjYWxsZWQgICdFbnZpcm9ubWVudGFsIElubm92YXRpb24gYW5kIFNvY2lldGFsIFRyYW5zaXRpb25zJy4gVGhlIGpvdXJuYWwgb2ZmZXJzIGEgcGxhdGZvcm0gZm9yIHJlcG9ydGluZyBzdHVkaWVzIG9mIGlubm92YXRpb25zIGFuZCBzb2Npby1lY29ub21pYyB0cmFuc2l0aW9ucyB0byBlbmhhbmNlIGFuIGVudmlyb25tZW50YWxseSBzdXN0YWluYWJsZSBlY29ub215IGFuZCB0aHVzIHNvbHZlIHN0cnVjdHVyYWwgcmVzb3VyY2Ugc2NhcmNpdHkgYW5kIGVudmlyb25tZW50YWwgcHJvYmxlbXMsIG5vdGFibHkgcmVsYXRlZCB0byBmb3NzaWwgZW5lcmd5IHVzZSBhbmQgY2xpbWF0ZSBjaGFuZ2UuIFRoaXMgaW52b2x2ZXMgYXR0ZW50aW9uIGZvciB0ZWNobm9sb2dpY2FsLCBvcmdhbml6YXRpb25hbCwgZWNvbm9taWMsIGluc3RpdHV0aW9uYWwgYW5kIHBvbGl0aWNhbCBpbm5vdmF0aW9ucyBhcyB3ZWxsIGFzIGVjb25vbXktd2lkZSBhbmQgc2VjdG9yIGNoYW5nZXMsIHN1Y2ggYXMgaW4gdGhlIGFyZWFzIG9mIGVuZXJneSwgdHJhbnNwb3J0LCBhZ3JpY3VsdHVyZSBhbmQgd2F0ZXIgbWFuYWdlbWVudC4gVGhlIGpvdXJuYWwgYWltcyB0byB0YWNrbGUgdGhlIG1vc3QgZGlmZmljdWx0IHF1ZXN0aW9ucywgZGVhbGluZyB3aXRoIHNvY2lhbCwgZWNvbm9taWMsIGJlaGF2aW9yYWwtcHN5Y2hvbG9naWNhbCBhbmQgcG9saXRpY2FsIGJhcnJpZXJzIGFuZCBvcHBvcnR1bml0aWVzIGFzIHdlbGwgYXMgdGhlaXIgY29tcGxleCBpbnRlcmFjdGlvbi4gVGhlIGpvdXJuYWwgaXMgbXVsdGlkaXNjaXBsaW5hcnkgaW4gc3Bpcml0IGFuZCBtZXRob2RvbG9naWNhbGx5IG9wZW4sIGFuZCBpbnZpdGVzIGNvbnRyaWJ1dGlvbnMgZnJvbSBhIGJyb2FkIHJhbmdlIG9mIGRpc2NpcGxpbmVzIHdpdGhpbiB0aGUgc29jaWFsLCBlbnZpcm9ubWVudGFsIGFuZCBpbm5vdmF0aW9uIHNjaWVuY2VzLiBTcGVjaWZpYyByZXNlYXJjaCBhcmVhcyBjb3ZlcmVkIGluY2x1ZGU6IFRoZW9yZXRpY2FsIGFuYWx5c2lzLCBmb3JtYWwgbW9kZWxpbmcsIGVtcGlyaWNhbCBzdHVkaWVzLCBwb2xpY3kgZGlzY3Vzc2lvbiBhbmQgYSBjcml0aWNhbCBzdXJ2ZXkgb2YgcmVsZXZhbnQgbGl0ZXJhdHVyZS4gUHJhY3RpY2FsIGNhc2VzIG1heSBhZGRyZXNzIHRyYW5zaXRpb25zIGluIHNwZWNpZmljIHNlY3RvcnMsIGNpdGllcyBvciByZWdpb25zLiBBcnRpY2xlcyBvbiBoaXN0b3JpY2FsIHRyYW5zaXRpb25zIG5vdCBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byBlbnZpcm9ubWVudCBhbmQgc3VzdGFpbmFiaWxpdHkgYXJlIHdlbGNvbWUgaWYgdGhleSBpbmNsdWRlIGEgc2VjdGlvbiB3aXRoIHVuaXF1ZSBsZXNzb25zIGZvciBzdXN0YWluYWJpbGl0eSB0cmFuc2l0aW9ucy4gQSBub24tZXhoYXVzdGl2ZSBsaXN0IG9mIGtleXdvcmRzIGFuZCB0aGVtZXMgaXMgYXMgZm9sbG93czogYmVoYXZpb3IgaW4gbGluZSB3aXRoIGJvdW5kZWQgcmF0aW9uYWxpdHksIGRldmVsb3BtZW50IHRoZW9yaWVzLCBkaWZmdXNpb24gb2YgaW5ub3ZhdGlvbnMsIGVudmlyb25tZW50YWwgcmVndWxhdGlvbiwgZm9ybWFsIG1vZGVsaW5nLCBnZW9ncmFwaHkgb2YgaW5ub3ZhdGlvbnMsIGhpc3RvcmljYWwgdHJhbnNpdGlvbnMsIGluY3JlYXNpbmcgcmV0dXJucyB0byBzY2FsZSBhbmQgcGF0aCBkZXBlbmRlbmNlLCBpbm5vdmF0aW9uIHBvbGljeSwgaW5zdGl0dXRpb25hbCBiYXJyaWVycywgaW50ZXJuYXRpb25hbCBjb29wZXJhdGlvbiBhbmQgY29vcmRpbmF0aW9uLCBsZWFybmluZy1ieS1kb2luZywgbGVhcm5pbmcgY3VydmVzLCBsb2NrLWluLCBuZXcgZ292ZXJuYW5jZSwgbmljaGUgbWFya2V0cywgb3B0aW1hbCB0ZWNobm9sb2dpY2FsIGRpdmVyc2l0eSwgcmVnaW1lIGFuYWx5c2lzLCBzb2NpYWwgYW5kIHBvbGl0aWNhbCBwb3dlciwgc3RyYXRlZ2ljIG5pY2hlIG1hbmFnZW1lbnQsIHJlYm91bmQgZWZmZWN0LCByZWNvbWJpbmFudCBpbm5vdmF0aW9uLCBzZWN0b3Igc3RydWN0dXJlLCBzb2NpYWwgbGVhcm5pbmcsIHRyYW5zaXRpb24gZXhwZXJpbWVudHMsIHRlY2hub2xvZ2ljYWwgcmVnaW1lcywgdHJhbnNpdGlvbiBwYXRod2F5cy9tZWNoYW5pc21zLCB2ZXN0ZWQgaW50ZXJlc3RzLCB2aXNpb25zIG9mIHRoZSBmdXR1cmUuIgoKcHJvbXRfZG9jX2ludHJvID0gIk5vdyBJIHByb3ZpZGUgeW91IHRoZSAxMCBhcnRpY2xlcy4gRXZlcnkgYXJ0aWNsZSBzdGFydHMgd2l0aCBhbiAnLScsIGFuZCBlbmRzIHdpdGggYSBsaW5lYnJlYWs6IgoKcHJvbXRfZmluYWwgPSAiVGhhdCB3YXMgdGhlIGxhc3QgZG9jdW1lbnQuIFlvdXIgdGFzayBpcyBub3cgdG8gc3VtbWFyaXplIHRoZSB0b3BpYyBieSBhIHNob3J0IGxhYmVsIG9mIDItNyB3b3JkcywgcGx1cyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIDMtNSBzZW50ZW5jZXMuIEl0IHNob3VsZCBjb25zaWRlciB0aGUgYXJ0aWNsZSBjb250ZW50IGFnYWluc3QgdGhlIGJhY2tncm91bmQgb2YgdGhlIGpvdXJuYWwgdGhleSBhcmUgcHVibGlzaGVkIGluLiBJdCBzaG91bGQgYmUgYnJpZWYsIGZvY3Vzc2VkLCBjbGVhciwgYW5kIGF2b2lkIHJlZHVuZGFuY2llcy4gVGhpcyBzdW1tYXJ5IHNob3VsZCBoaWdobGlnaHQgdGhlIGNvbW1vbmFsaXR5IG9mIHRoZSBkb2N1bWVudHMuIEl0IHNob3VsZCBpbmRpY2F0ZSB0aGUgbWFpbiB0aGVvcmV0aWNhbCB0aGVtZSwgcmVzZWFyY2ggZnJhbWV3b3JrIGFwcGxpZWQsIGNvbnRleHQsIHBvdGVudGlhbCBjb250cmlidXRpb25zIGFuZCBpbXBsaWNhdGlvbnMuIEl0IHNob3VsZCBhbHNvIGluZGljYXRlIGlmIHRoZSByZXNlYXJjaCBpbiB0aGlzIHRvcGljIGlzIG1vcmUgcXVhbnRpdGF0aXZlIG9yIHF1YWxpdGF0aXZlLCBvbiBhIG1hY3JvIG9yIG1pY3JvIGxldmVsLCBhbmQgYWltZWQgYXQgdGhlb3JldGljYWwsIHBvbGljeSwgb3IgaW5kdXN0cnkgaW1wbGljYXRpb25zLiIKYGBgCgpgYGB7cn0KdG9wX24gPSA1Cm5fZG9jID0gMTAKCnByb210X2RvYyA9IHBhc3RlKGRvY3NfdG9wICU+JSBmaWx0ZXIoY29tID09IHRvcF9uKSAlPiUgcHVsbCh0ZXh0KSwgY29sbGFwc2UgPSAnIFxuICcpCnByb210X2FsbCA8LSBwYXN0ZShwcm9tdF9pbnRybywgcHJvbXRfZG9jX2ludHJvLCBwcm9tdF9kb2MsIHByb210X2ZpbmFsLCBzZXAgPSAnIFxuIFxuICcpCmNhdChwcm9tdF9hbGwpCmBgYAoKIyMjIDE6IFN1c3RhaW5hYmlsaXR5IFRyYW5zaXRpb25zIGFuZCBJbm5vdmF0aW9ucwpUaGlzIHRvcGljIGV4cGxvcmVzIHRoZSBkeW5hbWljcyBvZiBzdXN0YWluYWJpbGl0eSB0cmFuc2l0aW9ucyBhbmQgaW5ub3ZhdGlvbnMgd2l0aGluIHNvY2lvLXRlY2huaWNhbCBzeXN0ZW1zLCBmb2N1c2luZyBvbiB2YXJpb3VzIGFzcGVjdHMgc3VjaCBhcyBsb2NrLWluIG1lY2hhbmlzbXMsIHBvbGl0aWNzLCBuaWNoZSBjb25zdHJ1Y3Rpb24sIGFuZCBidXNpbmVzcyBtb2RlbCBwZXJzcGVjdGl2ZXMuIFRoZSBhcnRpY2xlcyBhZG9wdCB0aGVvcmV0aWNhbCBmcmFtZXdvcmtzIGxpa2UgdGhlIG11bHRpLWxldmVsIHBlcnNwZWN0aXZlIChNTFApIGFuZCBhbmFseXplIGNhc2Ugc3R1ZGllcyBhY3Jvc3Mgc2VjdG9ycyBzdWNoIGFzIGVuZXJneSwgdHJhbnNwb3J0LCBhbmQgYWdyaWN1bHR1cmUuIFRoZSByZXNlYXJjaCBpcyBtb3N0bHkgcXVhbGl0YXRpdmUsIHdpdGggYW4gZW1waGFzaXMgb24gdW5kZXJzdGFuZGluZyB0aGUgY29tcGxleCBpbnRlcmFjdGlvbnMgYmV0d2VlbiBhY3RvcnMsIGluc3RpdHV0aW9ucywgYW5kIHRlY2hub2xvZ2llcywgYW5kIHRoZWlyIGltcGxpY2F0aW9ucyBmb3IgcG9saWN5IGFuZCBpbmR1c3RyeS4KCiMjIyAyOiBTdXN0YWluYWJpbGl0eSBUcmFuc2l0aW9ucyBhbmQgUG9saXRpY3MKClRoaXMgdG9waWMgZXhwbG9yZXMgdGhlIGludGVycGxheSBiZXR3ZWVuIHN1c3RhaW5hYmlsaXR5IHRyYW5zaXRpb25zIGFuZCBwb2xpdGljcyBpbiB0aGUgY29udGV4dCBvZiBzb2Npby10ZWNobmljYWwgc3lzdGVtcywgcG9saWN5IHByb2Nlc3NlcywgYW5kIGdvdmVybmFuY2UuIFRoZSBhcnRpY2xlcyBlbmNvbXBhc3MgYSByYW5nZSBvZiB0aGVvcmV0aWNhbCBmcmFtZXdvcmtzLCBtZXRob2RvbG9naWVzLCBhbmQgY2FzZSBzdHVkaWVzLCByZWZsZWN0aW5nIHRoZSBtdWx0aWRpc2NpcGxpbmFyeSBuYXR1cmUgb2YgdGhlIGpvdXJuYWwuIFJlc2VhcmNoIGluIHRoaXMgdG9waWMgaXMgcHJpbWFyaWx5IHF1YWxpdGF0aXZlLCBmb2N1c2luZyBvbiBtYWNyby1sZXZlbCBhbmFseXNpcyB3aXRoIGFuIGVtcGhhc2lzIG9uIHRoZW9yZXRpY2FsIGFuZCBwb2xpY3kgaW1wbGljYXRpb25zLiBDb250cmlidXRpb25zIGFkZHJlc3MgdmFyaW91cyBhc3BlY3RzIG9mIHN1c3RhaW5hYmlsaXR5IHRyYW5zaXRpb25zLCBzdWNoIGFzIHRoZSByb2xlIG9mIHRoZSBzdGF0ZSwganVzdGljZSwgaW5jdW1iZW50cywgZGlzY291cnNlcywgYW5kIGlubm92YXRpb24gc3BhY2VzLCBvZmZlcmluZyBpbnNpZ2h0cyBmb3IgdW5kZXJzdGFuZGluZyBhbmQgc3VwcG9ydGluZyBsYXJnZS1zY2FsZSBzb2NpZXRhbCBjaGFuZ2VzIHRvd2FyZHMgYSBzdXN0YWluYWJsZSBmdXR1cmUuCgojIyMgMzogU3VzdGFpbmFiaWxpdHkgVHJhbnNpdGlvbnMgYW5kIElubm92YXRpb24gU3lzdGVtcwpUaGUgY29tbW9uIHRoZW1lIGFjcm9zcyB0aGVzZSBhcnRpY2xlcyBpcyB0aGUgZXhwbG9yYXRpb24gb2Ygc3VzdGFpbmFiaWxpdHkgdHJhbnNpdGlvbnMgdGhyb3VnaCB0aGUgbGVucyBvZiB0ZWNobm9sb2dpY2FsIGlubm92YXRpb24gc3lzdGVtcyAoVElTKSBhbmQgdGhlaXIgdmFyaW91cyBpbnRlcmFjdGlvbnMgd2l0aCBjb250ZXh0dWFsIGZhY3RvcnMgc3VjaCBhcyBnZW9ncmFwaHksIHBvbGl0aWNzLCBhbmQgaW5zdGl0dXRpb25zLiBUaGVzZSBzdHVkaWVzIGFwcGx5IGJvdGggcXVhbGl0YXRpdmUgYW5kIHF1YW50aXRhdGl2ZSBhcHByb2FjaGVzLCBmb2N1c2luZyBvbiB0aGUgbWFjcm8gbGV2ZWwgb2Ygc29jaW8tdGVjaG5pY2FsIHN5c3RlbXMgYW5kIHRoZWlyIHRyYW5zaXRpb24gcGF0aHdheXMuIFRoZSByZXNlYXJjaCBkZWx2ZXMgaW50byB0aGUgdGhlb3JldGljYWwgYXNwZWN0cyBvZiBUSVMgYW5kIHRoZWlyIGltcGxpY2F0aW9ucyBmb3IgcG9saWN5IGFuZCBpbmR1c3RyeSwgcHJvdmlkaW5nIHZhbHVhYmxlIGluc2lnaHRzIGludG8gaG93IHRlY2hub2xvZ2ljYWwsIG9yZ2FuaXphdGlvbmFsLCBlY29ub21pYywgYW5kIGluc3RpdHV0aW9uYWwgaW5ub3ZhdGlvbnMgY2FuIGNvbnRyaWJ1dGUgdG8gYSBtb3JlIGVudmlyb25tZW50YWxseSBzdXN0YWluYWJsZSBlY29ub215LgoKIyMjIDQ6IEdlb2dyYXBoaWNhbCBQZXJzcGVjdGl2ZXMgaW4gU3VzdGFpbmFiaWxpdHkgVHJhbnNpdGlvbnMKVGhlc2UgdGVuIGFydGljbGVzIGNvbGxlY3RpdmVseSBmb2N1cyBvbiBnZW9ncmFwaGljYWwgcGVyc3BlY3RpdmVzIGluIHN1c3RhaW5hYmlsaXR5IHRyYW5zaXRpb25zLCBleGFtaW5pbmcgdGhlIHNwYXRpYWwgZGltZW5zaW9ucyBhbmQgbXVsdGktc3lzdGVtIGludGVyYWN0aW9ucyBpbiB0cmFuc2l0aW9uaW5nIHNvY2lvLXRlY2huaWNhbCBzeXN0ZW1zIHRvd2FyZHMgc3VzdGFpbmFiaWxpdHkuIFRoZSByZXNlYXJjaCBwcmltYXJpbHkgZW1wbG95cyBxdWFsaXRhdGl2ZSBtZXRob2RzIHRvIHN0dWR5IHRoZSBkeW5hbWljcyBvZiBhY3RvciBuZXR3b3JrcywgdXJiYW4gZXhwZXJpbWVudGF0aW9uLCBhbmQgbmljaGUgZGV2ZWxvcG1lbnQgaW4gdmFyaW91cyBzZWN0b3JzIGFuZCBjb250ZXh0cy4gVGhlc2UgY29udHJpYnV0aW9ucyBleHBsb3JlIHRoZSBpbXBvcnRhbmNlIG9mIHNwYXRpYWxpdHksIHBsYWNlLCBhbmQgc2NhbGUgaW4gdW5kZXJzdGFuZGluZyB0aGUgY29tcGxleGl0aWVzIG9mIHN1c3RhaW5hYmlsaXR5IHRyYW5zaXRpb25zLCB3aGlsZSBhbHNvIGNvbnNpZGVyaW5nIHRoZSBpbXBsaWNhdGlvbnMgZm9yIHBvbGljeSwgaW5kdXN0cnksIGFuZCBmdXR1cmUgcmVzZWFyY2guIEJ5IGVtcGhhc2l6aW5nIHRoZSByb2xlIG9mIGdlb2dyYXBoeSwgdGhpcyBib2R5IG9mIHdvcmsgaGVscHMgdG8gcmVmaW5lIGFuZCBleHRlbmQgdGhlIHRoZW9yZXRpY2FsIGZyYW1ld29ya3MgdXNlZCBpbiBzdHVkeWluZyBzdXN0YWluYWJpbGl0eSB0cmFuc2l0aW9ucy4KCiMjIyA1OiBTdXN0YWluYWJpbGl0eSBUcmFuc2l0aW9ucyBhbmQgR3Jhc3Nyb290cyBJbm5vdmF0aW9ucwpEZXNjcmlwdGlvbjogVGhlc2UgYXJ0aWNsZXMgZm9jdXMgb24gdGhlIHJvbGUgb2YgZ3Jhc3Nyb290cyBpbm5vdmF0aW9ucywgY29tbXVuaXR5IGxlYWRlcnNoaXAsIGFuZCBnb3Zlcm5hbmNlIGluIGZvc3RlcmluZyBzdXN0YWluYWJpbGl0eSB0cmFuc2l0aW9ucy4gVGhleSBleHBsb3JlIHZhcmlvdXMgYXNwZWN0cyBvZiBzb2Npby10ZWNobmljYWwgc3lzdGVtcywgbXVsdGktbGV2ZWwgZ292ZXJuYW5jZSwgYW5kIGFsdGVybmF0aXZlIGdlb2dyYXBoaWVzIG9mIGlubm92YXRpb24gdGhhdCBjYW4gZmFjaWxpdGF0ZSB0aGUgZGlmZnVzaW9uIG9mIGVudmlyb25tZW50YWxseSBzdXN0YWluYWJsZSBwcmFjdGljZXMuIFRoZSByZXNlYXJjaCBwcmltYXJpbHkgZW1wbG95cyBxdWFsaXRhdGl2ZSBjYXNlIHN0dWRpZXMgYW5kIGRyYXdzIG9uIGludGVyZGlzY2lwbGluYXJ5IHBlcnNwZWN0aXZlcyBmcm9tIHNvY2lvbG9neSwgcG9saXRpY2FsIHNjaWVuY2UsIGFuZCBpbm5vdmF0aW9uIHN0dWRpZXMuIFRoZSBhcnRpY2xlcyBjb250cmlidXRlIHRvIGJvdGggdGhlb3JldGljYWwgdW5kZXJzdGFuZGluZyBhbmQgcHJhY3RpY2FsIGltcGxpY2F0aW9ucyBmb3IgcG9saWN5bWFrZXJzLCBpbmR1c3RyeSBhY3RvcnMsIGFuZCBjb21tdW5pdHkgbGVhZGVycyBlbmdhZ2VkIGluIHByb21vdGluZyBzdXN0YWluYWJsZSB0cmFuc2l0aW9ucy4KCgojIEtub3dsZWRnZSBCYXNlcywgUmVzZWFyY2ggQXJlYXMgJiBUb3BpY3MgSW50ZXJhY3Rpb24KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQojIE5vZGVzCm5sXzNtIDwtIGNvbV9uYW1lc19iaWIgJT4lCiAgYmluZF9yb3dzKGNvbV9uYW1lc19jaXQpICU+JQogIGJpbmRfcm93cyhjb21fbmFtZXNfdG9wKSAlPiUKICByZW5hbWUobmFtZSA9IGxhYmVsLAogICAgICAgICBjb21fbnIgPSBjb20pICU+JQogIHJlbG9jYXRlKG5hbWUpCgojIEVkZ2VzCmVsXzJtX2tiIDwtIGVsXzJtICU+JQogIHNlbGVjdCgtZnJvbSwgLXRvKSAlPiUKICBpbm5lcl9qb2luKGNvbV9uYW1lc19jaXQgJT4lIHNlbGVjdChjb20sIGxhYmVsKSwgYnkgPSBjKCdjb21fY2l0JyA9ICdjb20nKSkgJT4lCiAgaW5uZXJfam9pbihjb21fbmFtZXNfYmliICU+JSBzZWxlY3QoY29tLCBsYWJlbCwgY29sKSwgYnkgPSBjKCdjb21fYmliJyA9ICdjb20nKSkgJT4lCiAgbXV0YXRlKHdlaWdodCA9IDEpICU+JQogIHJlbmFtZShmcm9tID0gbGFiZWwueCwKICAgICAgICAgdG8gPSBsYWJlbC55KSAlPiUgIyBnZW5lcmljCiAgc2VsZWN0KGZyb20sIHRvLCB3ZWlnaHQsIGNvbCkgJT4lIAogIGRyb3BfbmEoKSAlPiUgCiAgY291bnQoZnJvbSwgdG8sIGNvbCwgd3QgPSB3ZWlnaHQsIG5hbWUgPSAnd2VpZ2h0JykgJT4lCiAgZmlsdGVyKHBlcmNlbnRfcmFuayh3ZWlnaHQpID49IDAuMjUpICU+JQogIHdlaWdodF9qYWNjYXJkKGkgPSBmcm9tLCBqID0gdG8sIHcgPSB3ZWlnaHQpICU+JSAKICBzZWxlY3QoLXdlaWdodCkKCmVsXzJtX3RvcGljIDwtIHRleHRfbGRhX2dhbW1hICU+JSBzZWxlY3QoLXRvcGljLCAtY29sKSAlPiUKICBsZWZ0X2pvaW4oTV9iaWIgJT4lIHNlbGVjdChVVCwgY29tKSAlPiUgZHJvcF9uYShjb20pLCBieSA9IGMoJ2RvY3VtZW50JyA9ICdVVCcpKSAlPiUKICBpbm5lcl9qb2luKGNvbV9uYW1lc19iaWIgJT4lIHNlbGVjdChjb20sIGxhYmVsLCBjb2wpLCBieSA9IGMoJ2NvbScgPSAnY29tJykpICU+JQogIHJlbmFtZShmcm9tID0gbGFiZWwueSwKICAgICAgICAgdG8gPSBsYWJlbC54LAogICAgICAgICB3ZWlnaHQgPSBnYW1tYSkgJT4lICMgZ2VuZXJpYwogIHNlbGVjdChmcm9tLCB0bywgd2VpZ2h0LCBjb2wpICU+JSAKICBkcm9wX25hKCkgJT4lIAogIGNvdW50KGZyb20sIHRvLCBjb2wsIHd0ID0gd2VpZ2h0LCBuYW1lID0gJ3dlaWdodCcpICU+JQogIGZpbHRlcihwZXJjZW50X3Jhbmsod2VpZ2h0KSA+PSAwLjI1KSAlPiUKICB3ZWlnaHRfamFjY2FyZChpID0gZnJvbSwgaiA9IHRvLCB3ID0gd2VpZ2h0KSAlPiUgc2VsZWN0KC13ZWlnaHQpCgojIGdyYXBoCmdfM20gPC0gZWxfMm1fa2IgJT4lIAogIGJpbmRfcm93cyhlbF8ybV90b3BpYykgJT4lCiAgYXNfdGJsX2dyYXBoKGRpcmVjdGVkID0gVFJVRSkgJU4+JQogIGxlZnRfam9pbihubF8zbSwgYnkgPSAnbmFtZScpICU+JQogIG11dGF0ZSgKICAgIGxldmVsID0gY2FzZV93aGVuKAogICAgICB0eXBlID09ICJLQiIgfiAxLAogICAgICB0eXBlID09ICJSQSIgfiAyLAogICAgICB0eXBlID09ICJUUCIgfiAzKSwKICAgIGNvb3JkX3kgPSAwLjEsCiAgICBjb29yZF94ID0gMC4wMDEgKyAxLyhtYXgobGV2ZWwpLTEpICogKGxldmVsLTEpCiAgICApICAlTj4lCiAgZmlsdGVyKCFpcy5uYShsZXZlbCkpCmBgYAoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMjIEJ1aWxkIHNhbmtleSBwbG90CmZpZyA8LSBwbG90X2x5KHR5cGUgPSAic2Fua2V5IiwgCiAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gImgiLAogICAgICAgICAgICAgICBhcnJhbmdlbWVudCA9ICJzbmFwIiwKICBub2RlID0gbGlzdCgKICAgIGxhYmVsID0gZ18zbSAlTj4lIGFzX3RpYmJsZSgpICU+JSBwdWxsKG5hbWUpLAogICAgeCA9IGdfM20gJU4+JSBhc190aWJibGUoKSAlPiUgcHVsbChjb29yZF94KSwKICAgIHkgPSBnXzNtICVOPiUgYXNfdGliYmxlKCkgJT4lIHB1bGwoY29vcmRfeSksCiAgICBjb2xvciA9IGdfM20gJU4+JSBhc190aWJibGUoKSAlPiUgcHVsbChjb2wpLCAKICAgIHBhZCA9IDQKICApLCAKICBsaW5rID0gbGlzdCgKICAgIHNvdXJjZSA9IChnXzNtICVFPiUgYXNfdGliYmxlKCkgJT4lIHB1bGwoZnJvbSkpIC0xLAogICAgdGFyZ2V0ID0gKGdfM20gJUU+JSBhc190aWJibGUoKSAlPiUgcHVsbCh0bykpIC0xLAogICAgdmFsdWUgPSAgZ18zbSAlRT4lIGFzX3RpYmJsZSgpICU+JSBwdWxsKHdlaWdodF9qYWMpLAogICAgY29sb3IgPSBnXzNtICVFPiUgYXNfdGliYmxlKCkgJT4lIHB1bGwoY29sKSAlPiUgY29sMnJnYigpICU+JSBhcy5tYXRyaXgoKSAlPiUgdCgpICU+JSBhc190aWJibGUoKSAlPiUgCiAgICAgIG11dGF0ZShjb2xfcmdiID0gcGFzdGUwKCdyZ2JhKCcsIHJlZCwgJywnICwgZ3JlZW4sICcsJywgYmx1ZSwgJywwLjc1KScpKSAlPiUgIHB1bGwoY29sX3JnYikKICAgICkKKSAlPiUgCiAgbGF5b3V0KHRpdGxlID0gcGFzdGUoJ0tub3dsZWRnZSBCYXNlcywgUmVzZWFyY2ggQXJlYXMgJiBUb3BpY3M6JywgdmFyX2luc3QsICdGaWVsZCBhcm91bmQgRGVwdC4nLCB2YXJfZGVwdCwgc2VwID0gJyAnKSwKICAgICAgICAgbWFyZ2luID0gbGlzdChsID0gNTAsIHIgPSA1MCwgYiA9IDEwMCwgdCA9IDEwMCwgcGFkID0gMikpIApgYGAKCgojIyBKb2ludCBPdmVydmlldyBvdmVyIEtub3dsZWRnZSBCYXNlcywgUmVzZWFyY2ggQXJlYXMsIGFuZCBUb3BpY3MKClRoaXMgcGxvdCBzaG93cyB0aGUgY29ubmVjdGlvbiBvZiBwdWJsaWNhdGlvbnMgaW4gdGhlIHJlc2VhcmNoIGFyZWFzIHRvIGtub3dsZWRnZSBiYXNlcyAoYnkgY2l0YXRpb25zKSBhbmQgdG9waWNzIChieSBnYW1tYSwgZG9jdW1lbnQtdG9waWMgd2VpZ2h0KQoKYGBge3IsIGZpZy5oZWlnaHQ9IDEwLCBmaWcud2lkdGg9MTV9CmZpZwpgYGAKCgoKIyBUcmVuZHMgCgpgYGB7cn0KdW5pX3NpbSA8LSByZWFkX3JkcyhwYXN0ZTAoJy4uLy4uL3RlbXAvdW5pX3NpbV8nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICcucmRzJykpCmBgYAoKIyMgTGVhZC1MYWcgQW5hbHlzaXMgCgpgYGB7ciwgZmlnLmhlaWdodD01LCBmaWcud2lkdGg9Ny41fQpkZXNjIDwtIHVuaV9zaW0gJT4lIAogIGZpbHRlcihBVV9VTiA9PSBwYXN0ZSh2YXJfaW5zdCwgdmFyX2RlcHQpKSAlPiUKICBtdXRhdGUoZGVzYyA9IHBhc3RlMCgnTjogJywgbiwgJyBcbicsCiAgICAgICAgICAgICAgICAgICAgICAgJ1NpbWlsYXJpdHkgdG8gcGFzdDonLCBzaW1fcGFzdCAlPiUgcm91bmQoMiksICcgXG4nLAogICAgICAgICAgICAgICAgICAgICAgICdTaW1pbGFyaXR5IHRvIGZ1dHVyZTogJywgc2ltX2Z1dHVyZSAlPiUgcm91bmQoMiksICcgXG4nLAogICAgICAgICAgICAgICAgICAgICAgICdMZWFkLUxhZyBTY29yZTogJywgZnV0dXJlX3RyZW5kICU+JSByb3VuZCgyKSkpICU+JSBwdWxsKGRlc2MpCiAgCiAgCnVuaV9zaW0gJT4lCiAgc2xpY2VfbWF4KG9yZGVyX2J5ID0gbiwgbiA9IDEwMCkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gc2ltX3Bhc3QsIHkgPSBzaW1fZnV0dXJlKSkgKwogIGdlb21fbWFya19lbGxpcHNlKGFlcyhmaWx0ZXIgPSBBVV9VTiA9PSBwYXN0ZSh2YXJfaW5zdCwgdmFyX2RlcHQpLCBsYWJlbCA9IEFVX1VOLCBmaWxsID0gJ3JlZDEnKSwgZGVzY3JpcHRpb24gPSBkZXNjKSArIGd1aWRlcyhmaWxsID0gRkFMU0UpICsKICAjZ2VvbV9wb2ludChkYXRhID0gdW5pX3NpbSAlPiUgZmlsdGVyKEFVX1VOID09IHBhc3RlKHZhcl9pbnN0LCB2YXJfZGVwdCkpLCAKICAjICAgICAgICAgICBhZXMoc2l6ZSA9IG4pLCBjb2wgPSAnZGFya3JlZCcpICsgCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IG4sIGNvbCA9IGZ1dHVyZV90cmVuZCksIGFscGhhID0gMC41KSArCiAgZ2VvbV90ZXh0X3JlcGVsKCAKICAgIGRhdGEgPXVuaV9zaW0gJT4lIHNsaWNlX21heChvcmRlcl9ieSA9IG4sIG4gPSA1KSAlPiUgZmlsdGVyKEFVX1VOICE9IHBhc3RlKHZhcl9pbnN0LCB2YXJfZGVwdCkpLCAjIEZpbHRlciBkYXRhIGZpcnN0CiAgICBhZXMobGFiZWwgPSBBVV9VTiksCiAgICBib3gucGFkZGluZyA9IDEsIG1heC5vdmVybGFwcyA9IEluZikgKwogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbGluZXR5cGUgPSAiZGFzaGVkIiwgY29sID0gJ3Nub3czJykgKwogIHNjYWxlX2NvbG91cl9ncmFkaWVudChsb3cgPSAiYmx1ZSIsIGhpZ2ggPSAicmVkIiwgbmFtZSA9ICJMZWFkLUxhZyBTY29yZSIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnYm90dG9tJykgKwogIGxhYnMoeCA9ICdTaW1pbGFyaXR5IHRvIHBhc3QnLAogICAgICAgeSA9ICdTaW1pbGFyaXR5IHRvIGZ1dHVyZScsCiAgICAgICB0aXRsZSA9IHBhc3RlKCdGaWVsZCBMZWFkLUxhZyBBbmFseXNpczonLCB2YXJfaW5zdCwgdmFyX2RlcHQsIHNlcCA9ICcgJyksCiAgICAgICBzdWJ0aXRsZSA9IHBhc3RlKCdUaW1lZnJhbWU6JywgUFlfbWluLCAnLScsIFBZX21heCAsIHNlcCA9ICcgJyksCiAgICAgICBjYXB0aW9uID0gJ3ggYW5kIHkgYXhpcycpICsgCiAgbGltcyh4ID0gYygwLjgsIDEpLCB5ID0gYygwLjgsIDEpKQpgYGAKCjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KPCEtLSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBORVhUIFBBUlQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgLS0+CjwhLS0gIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIC0tPgo8IS0tICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAtLT4KCiMgQ29sbGFib3JhdGlvbiAKCmBgYHtyfQplbF9pbnN0IDwtIHJlYWRSRFMocGFzdGUwKCcuLi8uLi90ZW1wL2VsX2luc3RfJywgc3RyX3RvX2xvd2VyKHZhcl9pbnN0KSwgJ18nLCBzdHJfdG9fbG93ZXIodmFyX2RlcHQpLCAnLnJkcycpKQpgYGAKCgpgYGB7cn0KZ19pbnN0IDwtIGVsX2luc3QgJT4lIGFzX3RibF9ncmFwaChkaXJlY3RlZCA9IEZBTFNFKSAlRT4lCiAgZmlsdGVyKHdlaWdodCA+PSBjdXRvZl9lZGdlX2NpdCApICVOPiUKICBmaWx0ZXIoIW5vZGVfaXNfaXNvbGF0ZWQoKSkKYGBgCgojIyBDb2xsYWJvcmF0aW9uIG5ldHdvcmsgCgpgYGB7ciwgZmlnLmhlaWdodD0gMTAsIGZpZy53aWR0aD0xNX0KIyBnZXQgYmlnZ2VzdCBjb21wb25lbnQKY29tcG9uZW50cyA8LSBjbHVzdGVycyhnX2luc3QsIG1vZGU9IndlYWsiKQpiaWdnZXN0X2NsdXN0ZXJfaWQgPC0gd2hpY2gubWF4KGNvbXBvbmVudHMkY3NpemUpCnZlcnRfaWRzIDwtIFYoZ19pbnN0KVtjb21wb25lbnRzJG1lbWJlcnNoaXAgPT0gYmlnZ2VzdF9jbHVzdGVyX2lkXQppZ3JhcGg6OmluZHVjZWRfc3ViZ3JhcGgoZ19pbnN0LCB2ZXJ0X2lkcykKCmdfaW5zdCAlTj4lIAogIG11dGF0ZShjZW50ID0gY2VudHJhbGl0eV9kZWdyZWUod2VpZ2h0cyA9IHdlaWdodCkpICU+JQogIGZpbHRlcihuYW1lID09IHBhc3RlKHZhcl9pbnN0LCB2YXJfZGVwdCkgIHwgcmFuaygtY2VudCkgPD0gMTAwICkgJT4lCiAgZ2dyYXBoKGxheW91dCA9ICJmciIpICsgCiAgZ2VvbV9lZGdlX2xpbmsoYWVzKHdpZHRoID0gd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAjY29sb3IgPSAuTigpJG5hbWVbZnJvbV0gPT0gcGFzdGUodmFyX2luc3QsIHZhcl9kZXB0KSB8IC5OKCkkbmFtZVtmcm9tXSA9PSBwYXN0ZSh2YXJfaW5zdCwgdmFyX2RlcHQpLAogICAgICAgICAgICAgICAgICAgICAjZmlsdGVyID0gKHdlaWdodCA+PSB3ZWlnaHQgICU+JSBxdWFudGlsZSgwLjAxKSkKICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICwgYWxwaGEgPSAwLjI1KSAgKyAKICBnZW9tX25vZGVfcG9pbnQoYWVzKHNpemUgPSBjZW50KSwgY29sID0gJ3N0ZWVsYmx1ZTEnKSAgKyAKICBnZW9tX25vZGVfdGV4dChhZXMobGFiZWwgPSBuYW1lLCAKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGNlbnQsCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlciA9IChjZW50ID49IGNlbnQgICU+JSBxdWFudGlsZSgwLjI1KSkpLCByZXBlbCA9IFRSVUUpICsKICAjdGhlbWVfZ3JhcGgoYmFzZV9mYW1pbHkgPSAiQXJpYWwiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ2JvdHRvbScpICsKICBzY2FsZV9lZGdlX3dpZHRoX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuNSwgNSkpICArCiAgc2NhbGVfZWRnZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoImdyZXkiLCAicmVkIiksIG5hbWUgPSAnMXN0IGRlZ3JlZScpICsKICBzY2FsZV9zaXplKHJhbmdlID0gYygwLjUsMTApKSAKYGBgCgojIEVuZG5vdGVzCgpgYGB7cn0Kc2Vzc2lvbkluZm8oKQpgYGAKCjwhLS0tCiMgU2VlZCBBcnRpY2xlcwoKKipOb3RlOioqIFRoZSBzZWVkIGFydGljbGVzIGRlZW1lZCByZXByZXNlbnRhdGl2ZSBmb3IgdGhlIGFjdGl2ZSBhcmVhcyBvZiByZXNlYXJjaCBpbiB0aGUgaW5zdGl0dXRpb24sIGFuZCBpbmNsdWRlIGF1dGhvcnMgYWZmaWxpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGRlcGFydG1lbnRzIHJlc2VhcmNoIGZpZWxkIGlzIGlkZW50aWZpZWQgYnkgc2VsZWN0aW5nIHRoZSAyMDAwIG1vc3Qgc2ltaWxhciBwdWJsaWNhdGlvbnMgdG8gdGhlIHNlbGVjdGVkIHNlZWQgYXJ0aWNsZXMuIFNlZSBgVGVjaG5pY2FsIGRlc2NyaXB0aW9uYGZvciBhZGRpdGlvbmFsIGV4cGxhbmF0aW9ucy4KCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQpzZWVkIDwtY29udmVydDJkZihmaWxlID0gcGFzdGUwKCcuLi8uLi9kYXRhL3NlZWRzL3Njb3B1c18nLCBzdHJfdG9fbG93ZXIodmFyX2luc3QpLCAnXycsIHN0cl90b19sb3dlcih2YXJfZGVwdCksICdfc2VlZF9zZWxlY3QuY3N2JyksIGRic291cmNlID0gInNjb3B1cyIsIGZvcm1hdCA9ICJjc3YiKSAlPiUKICBhc190aWJibGUoKSAlPiUKICBtdXRhdGUoc2VlZCA9IFRSVUUpIApgYGAKCmBgYHtyfQpzZWVkICU+JQogIHNlbGVjdChBVSwgUFksIFRJLCBKSSkgJT4lCiAgbXV0YXRlKEFVID0gQVUgJT4lIHN0cl90cnVuYygzMCksCiAgICAgICAgIFRJID0gVEkgJT4lIHN0cl90cnVuYygxMDApLAogICAgICAgICBKSSA9IEpJICU+JSBzdHJfdHJ1bmMoMzApKSAlPiUKICBrYWJsZSgpICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZvbnRfc2l6ZSA9IDEwKQpgYGAKCi0tLT4K